當你想找一家餐廳吃飯,殊不知道去哪家,這時候手機跳出一條通知,爲你自動推送附近優質餐廳的信息,你會點擊查看嗎?當你還在店內糾結因而否買下一雙球鞋時,手機應用給了你發放了老顧客5折優惠券,這樣的廣告你有拒絕的理由嗎?java
這樣的廣告不只不會引發用戶的厭煩,還知足了用戶的需求。更準確的廣告推送,減小對用戶沒必要要的打擾,提升用戶對應用的滿意度。那如何才能給本身的APP增長一個針對附近人羣的精準廣告推送功能呢?android
能夠接入華爲近距離通訊服務,經過藍牙信標消息訂閱功能(Nearby Beacon Message)來實現. 在商場中部署Beacon,Beacon消息提供精確的相對位置信息,當用戶走近餐廳、商店時,就會收到本店預先配置好的促銷消息,例如優惠券、打折信息等等,從而能夠很便捷的對本店進行推廣,下圖是功能演示。git
若是你對實現方式感興趣,能夠在Github上下載源碼:
https://github.com/HMS-Core/hms-nearby-demo/tree/master/NearbyCanteensgithub
若是您已是華爲的開發者,能夠省略此步驟。若是您之前沒有集成華爲移動服務的經驗,那麼須要先配置AppGallery Connect,開通近距離通訊服務並集成HMS SDK。相關步驟請參考官方文檔。json
增量添加以下maven地址和agcp配置,如下不用修改,拷貝便可。api
buildscript { repositories { google() jcenter() maven { url 'http://developer.huawei.com/repo/' } } dependencies { classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.huawei.agconnect:agcp:1.2.1.301' } } allprojects { repositories { google() jcenter() maven { url 'http://developer.huawei.com/repo/' } } }
把近距離通訊服務SDK引入,最重要的是如下com.huawei開頭的SDK。網絡
dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' implementation "com.huawei.hmf:tasks:1.3.1.301" implementation "com.huawei.hms:network-grs:1.0.9.302" implementation 'com.huawei.agconnect:agconnect-core:1.2.1.301' implementation 'com.huawei.hms:nearby:4.0.4.300' api 'com.google.code.gson:gson:2.8.5' }
如下權限見名知義,好比android.permission.INTERNET就是須要網絡權限,android.permission.BLUETOOTH就是須要藍牙權限。如下權限都是必須的。app
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
onCreate是當前activity建立時會調用的方法,在這個方法裏頭,咱們能夠作一些準備動做,好比必要權限的申請,以及檢查手機網絡、藍牙、GPS是否開啓等。maven
@RequiresApi(api = Build.VERSION_CODES.P) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate"); setContentView(R.layout.activity_canteen); boolean isSuccess = requestPermissions(this, this); if (!isSuccess) { return; } Log.i(TAG, "requestPermissions success"); if (!NetCheckUtil.isNetworkAvailable(this)) { showWarnDialog(Constant.NETWORK_ERROR); return; } if (!BluetoothCheckUtil.isBlueEnabled()) { showWarnDialog(Constant.BLUETOOTH_ERROR); return; } if (!GpsCheckUtil.isGpsEnabled(this)) { showWarnDialog(Constant.GPS_ERROR); return; } intView(); init(); }
註冊監聽,當檢測到手機藍牙、GPS、網絡未鏈接時,給出提示: 如下使用的是Android中的AlertDialog組件來作提示。ide
private void showWarnDialog(String content) { DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { android.os.Process.killProcess(android.os.Process.myPid()); } }; AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle(R.string.warn); builder.setIcon(R.mipmap.warn); builder.setMessage(content); builder.setNegativeButton(getText(R.string.btn_confirm), onClickListener); builder.show(); }
如下這個startScanning方法,是在onStart方法中被調用的,表示開始啓動藍牙掃描,而且如下的MessageHandler對象中,封裝了4個回調方法(onFound表示獲取到beacon消息,OnLost表示消息丟失,onDistanceChanged表示beacon與本手機的距離變化,onBleSignalChanged表示監測到beacon的信號變化)。
最重要的就是如下的doOnFound方法,表示接收到beacon消息時,客戶端的處理方式,能夠作個性化展現。
private void doOnFound(Message message) { if (message == null) { return; } String type = message.getType(); if (type == null) { return; } String messageContent = new String(message.getContent()); Log.d(TAG, "New Message:" + messageContent + " type:" + type); if (type.equalsIgnoreCase(Constant.CANTEEN)) { operateOnFoundCanteen(messageContent); } else if (type.equalsIgnoreCase(Constant.NOTICE)) { operateOnFoundNotice(messageContent); } }
自定義展現:
下面的方法只是簡單的演示其中一種消息處理方式,包括客戶端上的通知欄橫幅通知、頁面字體滑動展現等操做。
private void operateOnFoundCanteen(String messageContent) { CanteenAdapterInfo canteenAdapterInfo = (CanteenAdapterInfo) JsonUtils.json2Object(messageContent, CanteenAdapterInfo.class); if (canteenAdapterInfo == null) { return; } String canteenName = canteenAdapterInfo.getCanteenName(); if (canteenName == null) { return; } Log.d(TAG, "canteenName:" + canteenName); if (!canteenNameList.contains(canteenName)) { return; } String notice = ""; if (receivedNoticeMap.containsKey(canteenName)) { notice = receivedNoticeMap.get(canteenName); } int canteenImage = getCanteenImage(canteenName); int requestCode = getRequestCode(canteenName); canteenAdapterInfo.setNotice(notice); canteenAdapterInfo.setCanteenImage(canteenImage); canteenAdapterInfo.setShowNotice(true); canteenAdapterInfo.setRequestCode(requestCode); canteenAdapterInfoMap.put(canteenName, canteenAdapterInfo); canteenAdapterInfoList.add(canteenAdapterInfo); sendNotification(Constant.NOTIFICATION_TITLE, Constant.NOTIFICATION_SUBTITLE, canteenName, requestCode); runOnUiThread( new Runnable() { @Override public void run() { searchTipTv.setText(R.string.found_tip); loadingLayout.setVisibility(View.GONE); canteenAdapter.setDatas(canteenAdapterInfoList); } }); }
本次給你們演示的demo用到了華爲Nearby Service的藍牙信標消息訂閱功能
基於Nearby Beacon Message能力不單單能夠用來作廣告推送,還能夠實現以下相關功能:
汽車生活類應用集成Nearby Beacon Message功能後,能夠識別用戶靠近汽車,通知App啓用無鑰匙進入,記錄行駛軌跡等。
辦公類應用集成Nearby Beacon Message功能後,可快速準確記錄員工打卡位置。
旅遊、展覽類應用集成Nearby Beacon Message功能後,當用戶靠近某個展品或文物時候,可以獲取相應的介紹信息。
更詳細的開發指南可參考華爲開發者聯盟官網
往期連接:超簡單集成ML kit 實現聽寫單詞播報
原文連接:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201283747724140328&fid=18原做者:趙照