讓你的音樂APP脫穎而出,更懂用戶,也更動人心、java
做爲音樂發燒友,閒下來的時候總想打開App,享受沉浸在音樂中的放鬆。然而,App推薦的歌單常常無法知足個人須要,若是App能根據我當前的情景狀態,推送給個人歌曲剛好就是我當前最想聽的,那該多好啊~segmentfault
情景感知服務(Awareness Kit)能感知用戶當前的時間、地理位置、活動狀態、耳機狀態、天氣情況、環境光、車載鏈接狀態、信標鏈接狀態等情景,並經過能常駐後臺運行的圍欄能力向APP進行提醒,使APP能第一時間給用戶提供精準和貼心的服務。上述情景感知能力還在不斷擴充中,並且您能夠自由組合這些感知能力,構建組合圍欄,從而讓APP的服務能力更加智能,更加精準。app
在情景感知服務的支持下,App能給用戶帶來以下體驗ide
同時,用戶還能夠經過各類感知能力的組合圍欄,設置排除場景,避免給用戶過多打擾。ui
無需用戶提早開啓App,用戶進入地理圍欄範圍後,便可後臺激活App,觸發通知。this
無懼App進程被系統殺死,經過圍欄服務,依然可接受到通知。code
點擊通知,便可前臺激活APP,點擊直接跳轉App推薦界面。接口
經過組合圍欄實現精準推送;也可避免在用戶不須要的場景提供無效通知,避免頻繁打擾。進程
Awareness Kit集成須要有以下3個關鍵步驟,能夠參考華爲開發者聯盟的文檔事件
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/awareness-preparation
//建立一個感知耳機鏈接的圍欄,當耳機處於鏈接狀態時,此圍欄的狀態爲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";
//把剛剛建立好的耳機圍欄和它對應的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(); });
//本示例中咱們耳機圍欄的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被殺後依然推送,能夠把該接收器設置爲靜態廣播接收器。
在用戶點擊通知打開app後,能夠經過Awareness各個能力的快照接口來獲取用戶當前的情景狀態以推薦不一樣歌單。
例如獲取時間情景狀態:
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(); });
獲取用戶當前的活動狀態以推薦歌單:
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); });
獲取當前是不是鏈接車載藍牙:
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://developer.huawei.com/consumer/cn/forum/topicview?fid=18&tid=0201246052748810283&pid=0301246052748810253原做者:Ascend