1. 程式人生 > >Awareness Kit讓你的音樂APP脫穎而出,更懂使用者,也更動人心

Awareness Kit讓你的音樂APP脫穎而出,更懂使用者,也更動人心

**讓你的音樂APP脫穎而出,更懂使用者,也更動人心**、 # 場景 ### 情景感知服務能帶來什麼?   作為音樂發燒友,閒下來的時候總想開啟App,享受沉浸在音樂中的放鬆。然而,App推薦的歌單經常沒法滿足我的需要,如果App能根據我當前的情景狀態,推送給我的歌曲恰好就是我當前最想聽的,那該多好啊~ ### 什麼是情景感知服務?   情景感知服務(Awareness Kit)能感知使用者當前的時間、地理位置、活動狀態、耳機狀態、天氣狀況、環境光、車載連線狀態、信標連線狀態等情景,並通過能常駐後臺執行的圍欄能力向APP進行提醒,使APP能第一時間給使用者提供精準和貼心的服務。上述情景感知能力還在不斷擴充中,而且您可以自由組合這些感知能力,構建組合圍欄,從而讓APP的服務能力更加智慧,更加精準。 在情景感知服務的支援下,App能給使用者帶來如下體驗 - 每次連線上耳機(有線耳機、藍芽耳機),手機通知欄會彈出音樂App通知,提示使用者時候是否要啟動音樂播放,或者是否要自動播放音樂 - 點選通知,可以開啟音樂APP,並展示使用者當前情境下最恰當的歌單 - 跑步開始,推薦節奏輕快歌單;跑步結束,推薦節奏緩場歌單 - 清晨起床,連線耳機,來點清新音樂;夜深人靜,連線耳機,讓靜心的音樂讓我舒緩 - 發動汽車,手機連線藍芽車載,音樂App自動切換成車載模式,並主動詢問是否播放各場景的行車音樂(白天、夜晚、雨天、晴天,推薦各不同) - 不同的節日,應該有特別的節日音樂 同時,使用者還可以通過各種感知能力的組合圍欄,設定排除場景,避免給使用者過多打擾。 ### 情景感知服務的優勢   無需使用者提前開啟App,使用者進入地理圍欄範圍後,即可後臺啟用App,觸發通知。   無懼App程序被系統殺死,通過圍欄服務,依然可接受到通知。   點選通知,即可前臺啟用APP,點選直接跳轉App推薦介面。   通過組合圍欄實現精準推送;也可避免在使用者不需要的場景提供無效通知,避免頻繁打擾。 ---- # 開發前準備 Awareness Kit整合需要有如下3個關鍵步驟,可以參考華為開發者聯盟的文件 1. AppGallery Connect配置 2. 整合HMS Awareness SDK 3. 配置混淆指令碼 [https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/awareness-preparation](https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/awareness-preparation) --- # 程式碼開發關鍵步驟 1. 建立耳機圍欄 ```java //建立一個感知耳機連線的圍欄,當耳機處於連線狀態時,此圍欄的狀態為true AwarenessBarrier headsetBarrier = HeadsetBarrier.keeping(HeadsetStatus.CONNECTED); //建立一個PendingIntent,當圍欄狀態改變的時候,會觸發該PendingIntent,這裡以傳送廣播為例 PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT); //建立圍欄的標籤,後續可以通過標籤查詢或者刪除對應圍欄 String headsetBarrierLabel = "headset keeping connected label"; ``` 2. 註冊圍欄 ```java //把剛剛建立好的耳機圍欄和它對應的label,pendingIntent註冊給Awareness kit Awareness.getBarrierClient(context).updateBarriers(new BarrierUpdateRequest.Builder() .addBarrier(headsetBarrierLabel,headsetBarrier,pendingIntent).build()) .addOnSuccessListener(aVoid -> { //註冊圍欄成功 Log.i(TAG,"add barrier success"); }) .addOnFailureListener(e -> { //註冊圍欄失敗 Log.e(TAG,"add barrier failed"); e.printStackTrace(); }); ``` 3. 建立廣播接收器監聽圍欄事件 ```java //本示例中我們耳機圍欄的PendingIntent設定的是傳送廣播,所以需要定義對應的廣播接收器來監聽圍欄的狀態 public final class HeadsetBarrierReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //圍欄的資訊通過intent傳遞過來,我們通過Barrier.extract方法將其解析出來 BarrierStatus barrierState = BarrierStatus.extract(intent); //通過BarrierStatus獲取label和圍欄的當前狀態 String label = barrierState.getBarrierLabel(); int status = barrierState.getPresentStatus(); if (status == BarrierStatus.TRUE && label.equals(headsetBarrierLabel)) { //當圍欄狀態為true時,代表耳機處於連線狀態,這時就可以在通知欄推送相關訊息 //send Notification.... } } } ```   定義完廣播接收器後別忘記註冊該廣播接收器,如果需要APP被殺後依然推送,可以把該接收器設定為靜態廣播接收器。 4. 通過Awareness快照介面獲取當前情景狀態   在使用者點選通知開啟app後,可以通過Awareness各個能力的快照介面來獲取使用者當前的情景狀態以推薦不同歌單。   例如獲取時間情景狀態: ```java Awareness.getCaptureClient(context).getTimeCategories() .addOnSuccessListener(timeIntervalsResponse -> { TimeCategories categories = timeIntervalsResponse.getTimeCategories(); if (categories.isTimeCategory(TimeBarrier.TIME_CATEGORY_HOLIDAY)) { //當天是節假日,可推薦節假日歌單 } if (categories.isTimeCategory(TimeBarrier.TIME_CATEGORY_WEEKEND)) { //當天是週末,可推薦週末歌單 } if (categories.isTimeCategory(TimeBarrier.TIME_CATEGORY_NIGHT)) { //當前是深夜,可推薦深夜歌單 } }) .addOnFailureListener(e -> { //獲取時間資訊失敗 Log.e(TAG, "get Time Categories failed"); e.printStackTrace(); }); ```   獲取使用者當前的活動狀態以推薦歌單: ```java Awareness.getCaptureClient(context).getBehavior() .addOnSuccessListener(behaviorResponse -> { BehaviorStatus behaviorStatus = behaviorResponse.getBehaviorStatus(); DetectedBehavior mostLikelyBehavior = behaviorStatus.getMostLikelyBehavior(); String str = "Most likely behavior is " + mostLikelyBehavior.getType(); }) .addOnFailureListener(e -> { //獲取活動狀態失敗 Log.e(TAG, "Failed to get the behavior.", e); }); ```   獲取當前是否是連線車載藍芽: ```java int deviceType = 0; // 0 代表獲取的裝置型別為車載藍芽 Awareness.getCaptureClient(this).getBluetoothStatus(deviceType) .addOnSuccessListener(bluetoothStatusResponse -> { BluetoothStatus bluetoothStatus = bluetoothStatusResponse.getBluetoothStatus(); int status = bluetoothStatus.getStatus(); if (status == BluetoothStatus.CONNECTED) { //當前是連線車載藍芽,可將app切換為車載模式 } }) .addOnFailureListener(e -> { //獲取車載藍芽狀態失敗 Log.e(TAG, "Failed to get Bluetooth status.", e); }); ``` --- 往期連結:[一文搞懂文字識別、銀行卡識別、通用卡證識別、身份證識別](https://www.cnblogs.com/developer-huawei/p/12856200.html) 內容來源:[https://developer.huawei.com/consumer/cn/forum/topicview?fid=18&tid=0201246052748810283&pid=0301246052748810253](https://developer.huawei.com/consumer/cn/forum/topicview?fid=18&tid=0201246052748810283&pid=0301246052748810253) 原作者