当你想找一家餐厅吃饭,却不知道去哪家,这时候手机跳出一条通知,为你自动推送附近优质餐厅的信息,你会点击查看吗?当你还在店内纠结于是否买下一双球鞋时,手机应用给了你发放了老顾客5折优惠券,这样的广告你有拒绝的理由吗?

  这样的广告不仅不会引起用户的厌烦,还满足了用户的需求。更准确的广告推送,减少对用户不必要的打扰,提高用户对应用的满意度。那如何才能给自己的APP增加一个针对附近人群的精准广告推送功能呢?

  可以接入华为近距离通信服务,通过蓝牙信标消息订阅功能(Nearby Beacon Message)来实现. 在商场中部署Beacon,Beacon消息提供精确的相对位置信息,当用户走近餐厅、商店时,就会收到本店预先配置好的促销消息,例如优惠券、打折信息等等,从而可以很便捷的对本店进行推广,下图是功能演示。

  如果你对实现方式感兴趣,可以在Github上下载源码:
  https://github.com/HMS-Core/hms-nearby-demo/tree/master/NearbyCanteens

1.开发准备

  如果您已经是华为的开发者,可以省略此步骤。如果您以前没有集成华为移动服务的经验,那么需要先配置AppGallery Connect,开通近距离通信服务并集成HMS SDK。相关步骤请参考官方文档。

1.1 在项目级gradle里添加华为maven仓和agcp配置

  增量添加如下maven地址和agcp配置,以下不用修改,拷贝即可。

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/' }}}

1.2 在应用级的build.gradle里面加上SDK依赖

  把近距离通信服务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'}

1.3 在AndroidManifest.xml文件里面申请网络权限、蓝牙权限和位置权限

  以下权限见名知义,比如android.permission.INTERNET就是需要网络权限,android.permission.BLUETOOTH就是需要蓝牙权限。以下权限都是必须的。

<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" />

2. 代码开发

2.1 初始化以及动态权限申请

  onCreate是当前activity创建时会调用的方法,在这个方法里头,我们可以做一些准备动作,比如必要权限的申请,以及检查手机网络、蓝牙、GPS是否开启等。

@RequiresApi(api = Build.VERSION_CODES.P)@Overrideprotected 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组件来做提示。

private void showWarnDialog(String content) {DialogInterface.OnClickListener onClickListener =new DialogInterface.OnClickListener() {@Overridepublic 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();}

2.2 接收Beacon消息的过程

  以下这个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() {@Overridepublic void run() {searchTipTv.setText(R.string.found_tip);loadingLayout.setVisibility(View.GONE);canteenAdapter.setDatas(canteenAdapterInfoList);}});}

结后语

  本次给大家演示的demo用到了华为Nearby Service的蓝牙信标消息订阅功能

  基于Nearby Beacon Message能力不仅仅可以用来做广告推送,还可以实现如下相关功能:

  1. 汽车生活类应用集成Nearby Beacon Message功能后,可以识别用户靠近汽车,通知App启用无钥匙进入,记录行驶轨迹等。

  2. 办公类应用集成Nearby Beacon Message功能后,可快速准确记录员工打卡位置。

  3. 旅游、展览类应用集成Nearby Beacon Message功能后,当用户靠近某个展品或文物时候,能够获取相应的介绍信息。

  4. 游戏类应用使用Nearby Beacon Message,可以实现游戏和现实场景互动。通过现实物体触发游戏关卡,或者对参与线下活动的游戏玩家给予游戏道具奖励。

  更详细的开发指南可参考华为开发者联盟官网


往期链接:超简单集成ML kit 实现听写单词播报
原文链接:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0201283747724140328&fid=18
原作者:赵照

如何用Nearby Service开发针对附近人群的精准广告推送功能相关推荐

  1. HMS Core地理围栏能力助你实现指定范围人群的精准消息推送

    精准推送是移动端产品留存阶段的主要运营手段,精准推送常常会与用户画像紧密结合,针对用户的喜好.画像,采用不同策略,但基于用户所属区域推送消息却很难实现.目前市面上大多数第三方消息推送服务商,在系统未深 ...

  2. Java使用HTTPClient4.3开发的公众平台消息模板的推送功能

    代码引用,参考文章:http://www.cnblogs.com/feiyun126/p/4778556.html,表示感谢! 1 package com.yuanchuangyun.cyb.mana ...

  3. web广告推送功能开发总结

    这段时间研究了下web广告推送功能,简单的需求如下: 1,android手机连上wifi后,提示认证登录,iphone 手机连上wifi后自动弹出指定页面 2,android手机点击认证登录,ipho ...

  4. python爬虫教程:如何用40行Python代码实现天气预报和每日鸡汤推送功能

    这篇文章主要介绍了通过40行Python代码实现天气预报和每日鸡汤推送功能,代码简单易懂,非常不错具有一定的参考借鉴价值 ,需要的朋友可以参考下 情人节刚过去几天,但是这和我们程序员有什么关系呢,对我 ...

  5. 云开发实现小程序订阅消息推送功能

    步骤一:获取模板 ID 在微信公众平台手动配置获取模板 ID: 登录 https://mp.weixin.qq.com 获取模板,如果没有合适的模板,可以申请添加新模板,审核通过后可使用. 步骤二:请 ...

  6. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    C#微信公众号开发系列教程五(接收事件推送与消息排重) 原文:C#微信公众号开发系列教程五(接收事件推送与消息排重) 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续 ...

  7. 小程序云开发之消息推送功能

    小程序云开发之消息推送功能(图文) 一:新建项目 APPID获取方法:1.在微信公众平台上注册账号,选择小程序(也可以从服务号注册,前提你有一个服务号)注册后登录,登录时微信扫码验证一下 2.填写小程 ...

  8. 微信小程序消息推送功能开发(java实现)

    先好好把官方文档看一看,链接https://developers.weixin.qq.com/miniprogram/dev/framework/server-ability/message-push ...

  9. AI人脸检测/口罩检测/安全帽检测智能分析网关告警推送功能开发

    智能分析网关是可支持AI视频智能分析功能,包括人体检测.人脸检测.区域入侵检测.安全帽检测.口罩检测等,可广泛应用于客流统计.安防监控.周界防范.企业安全生产.公共防疫等场景.目前我们仍在进一步拓展更 ...

最新文章

  1. 以智能数据架构,挖掘增长金矿
  2. ui与html界面区别,ui前端和web前端的区别是什么?
  3. mac mysql创建本地数据库_【mac】配置本地数据库
  4. Linux用户登录自动拷贝文件,linux下ssh远程登录/scp远程复制文件/rsync远程同步命令的自动登录...
  5. linux下如何搜索某个文件,技术|如何在 Linux 中查找一个文件
  6. 超级计算机发展及现状论文,浅谈超级计算机发展的过程及研究现状
  7. java解析多层嵌套json字符串
  8. mongoDB cluster insert slow
  9. Android 学习笔记 databinding简单使用:使用databinding在listview加入不同类型的view
  10. OpenGL ES着色器语言之变量和数据类型(二)(官方文档第四章)
  11. linux安装了vnc服务器,Linux安装VNC服务及配置
  12. Linux用户基础操作入门
  13. 荒芜的周六-PHP之面向对象(三)
  14. 2019.7.26随堂笔记
  15. Ubuntu下yolov4训练自己的数据集
  16. 【优化算法】粒子群优化模拟器【含Matlab源码 1553期】
  17. python新浪微博爬虫_scrapy实现新浪微博爬虫
  18. 独家汉化SDL Passolo 2018(软件汉化工具) v18.0.130简体中文版
  19. 电磁仿真原理——1.0 电磁仿真原理简介
  20. Android扫描系统文件,安卓文档扫描仪

热门文章

  1. IT历史:互联网简史
  2. 《Deep Spatio-Temporal Random Fields for Efficient Video Segmentation》论文阅读
  3. 数字化改造转型到底意味着什么
  4. 中国移动-北京移动2015年校招面试
  5. 计算机专业原创心理情景剧剧本,[原创]心理情景剧剧本.doc
  6. 【PaperReading】使用limma、Glimma和edgeR对RNA-seq数据分析
  7. C++:输入长方体长宽高计算体积(使用构造函数)。
  8. java简易计算机(用栈实现中缀转后缀,计算后缀表达式)
  9. (8)USB协议2——从单bit到数据包
  10. 【MySQL数据库】--- 初识数据库以及MySQL数据库在Linux云服务器下载(详细教程)