当你想找一家餐厅吃饭,殊不知道去哪家,这时候手机跳出一条通知,为你自动推送附近优质餐厅的信息,你会点击查看吗?当你还在店内纠结因而否买下一双球鞋时,手机应用给了你发放了老顾客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原做者:赵照