简介

Nearby Message是在连接Internet的情况下,订阅者发现周边消息发布者,然后从云服务器获取到发布者注册的消息。典型的应用场景如下:

您将建立什么

在本篇codelab中,您将使用已经创建好的Demo Project实现对华为Nearby开放服务的API调用,Nearby Message使用场景有两类,一类是基于应用的消息发布和订阅;另一类是基于Beacon的消息发布和订阅。此Demo是基于Beacon的使用场景。通过Demo Project您可以体验到:

您将会学到什么

硬件要求

软件要求

集成HMS Core能力,需要完成以下准备工作

具体操作,请按照《HUAWEI HMS Core 集成准备》中详细说明来完成。

登录华为开发者联盟网站管理中心,先点击"我的API",然后选择您要开通服务的项目,最后点击"申请新的HMS API服务",进入HMS API库的详情页面。

进入HMS API库的详情页面之后,点击"近距离通信服务",进入近距离通信服务的页面。

近距离通信服务的页面之后,点击"启用"开关,启用近距离通信服务。

添加AGC配置文件

AppGallery Connect网站上,选择"我的项目",在项目列表中找到您的项目,在项目下的应用列表中选择您的应用。选择"项目设置 > 常规",点击 "添加SDK",按照文档指引操作。

添加编译依赖

打开应用级的build.gradle文件:

在build.gradle文件头添加配置:

apply plugin: 'com.huawei.agconnect'

添加Java版本配置:

compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }

将编译依赖项添加到"dependencies" 中:

dependencies { implementation 'com.huawei.hms:nearby: {version}' }

如图所示:

配置混淆脚本

打开Android Studio工程的混淆配置文件proguard-rules.pro。

加入排除HMS Core SDK的混淆配置。

-ignorewarnings -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable -keep class com.hianalytics.android.**{*;} -keep class com.huawei.updatesdk.**{*;} -keep class com.huawei.hms.**{*;}

如果开发者使用了AndResGuard,需要在混淆配置文件中加入AndResGuard允许清单。

"R.string.hms*", "R.string.connect_server_fail_prompt_toast", "R.string.getting_message_fail_prompt_toast", "R.string.no_available_network_prompt_toast", "R.string.third_app_*", "R.string.upsdk_*", "R.layout.hms*", "R.layout.upsdk_*", "R.drawable.upsdk*", "R.color.upsdk*", "R.dimen.upsdk*", "R.style.upsdk*", "R.string.agc*"

同步工程

点击File > Sync Project with Gradle Files同步工程。

如下图出现synced successfully,即代表同步成功。

在上一小节中,您已经成功集成了Nearby Service SDK。本小节您将尝试编写一个Demo,学会在Beacon场景下,如何使用Nearby Service SDK的主要接口。您只需要按照下文的每一步提示,就可以边学边做,一起构建出这个Demo。

修改AndroidManifest.xml

首先,您需要修改应用的权限。在您的工程中找到app目录下的src目录,修改src目录下的AndroidManifest.xml文件,在文件中添加以下6种权限。

代码如下:

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- Android6.0之后,BLE扫描还需要地理位置权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

复制代码和资源文件

按照Demo的代码目录,在工程的Project视图下,复制以下文件到您新建工程对应的目录下:

Demo代码示例

以我们提供的Demo为例,我们的Demo演示了基于Beacon的附近餐厅优惠信息推送。
注册监听,当检测到手机蓝牙、GPS、网络未连接时,给出提示,代码示例如下:
NearbyCanteens\src\app\src\main\java\com\huawei\hms\nearby\beaconcanteen\CanteenActivity.java

private void registerStatusReceiver() { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); intentFilter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED); intentFilter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED); intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); intentFilter.addAction(LocationManager.PROVIDERS_CHANGED_ACTION); mContext.registerReceiver(stateChangeReceiver, intentFilter); }

以下代码是靠近餐厅的beacon设备时,接收消息的过程,代码示例如下:

NearbyCanteens\src\app\src\main\java\com\huawei\hms\nearby\beaconcanteen\CanteenActivity.java

mMessageHandler = new MessageHandler() { @Override public void onFound(Message message) { super.onFound(message); doOnFound(message); } }; MessagePicker msgPicker = new MessagePicker.Builder().includeAllTypes().build(); Policy policy = new Policy.Builder().setTtlSeconds(Policy.POLICY_TTL_SECONDS_INFINITE).build(); GetOption getOption = new GetOption.Builder().setPicker(msgPicker).setPolicy(policy).build(); Task<Void> task = messageEngine.get(mMessageHandler, getOption);

以下是接近各餐厅beacon设备后,获得各餐厅推出的优惠信息,并将优惠信息实时推送到程序前台并显示,代码示例如下:

NearbyCanteens\src\app\src\main\java\com\huawei\hms\nearby\beaconcanteen\CanteenActivity.java

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); } }

编译、加载、调试

当您根据自己的需要,修改完代码后,就可以进行编译。
完成编译后,生成APK,安装到华为手机上,并调试、运行。

我们通过示例代码BeaconManger来对信标进行管理。详细的信标管理接口,请参见注册信标设备

创建服务子帐号

登录华为开发者联盟网站管理中心,先点击"凭证",然后选择相应的项目,最后点击"服务帐号密钥"。

进入创建服务帐号密钥的页面之后,依次填入名称、描述后,点击"生成公私钥",最后点击"创建并下载JSON"即可完成创建,请将JSON密钥文件妥善保存到手机上。

运行BeaconManger示例App

请根据BeaconManger示例中的README.md文件的操作步骤配置并运行示例App。

帐号登录

运行App后,请选择My Center标签页,点击头像并选择创建服务子帐号步骤下载下来的JSON密钥文件进行登录。

注册Beacon

选择Unregistered标签页,刷新页面来找到Beacon。点击Beacon条目来对Beacon1和Beacon2进行注册。

配置消息附件

选择Registered标签页,分别点击Beacon条目来对Beacon1和Beacon2进行消息附件配置。

分别对Beacon1设备和Beacon2设备进行消息附件配置:
1、配置Beacon1设备。

a.消息类型填入canteen,消息内容填入{"canteenDesc":"This is the description of Canteen A.","canteenName":"Canteen A"},提交。

b.消息类型填入notice,消息内容填入{"canteenName":"Canteen A","notice":"Huawei employees dinning here can get a 20% discount and a free fruit platter."}后提交。

2、配置Beacon2设备。

a.消息类型填入canteen,消息内容填入{"canteenDesc":"This is the description of Canteen B.","canteenName":"Canteen B"},提交。

b. 选择消息空间、消息类型填入notice,消息内容填入{"canteenName":"Canteen B","notice":"12% off for all dishes on New Year's Eve. VIPs can have an extra 10% discount."},提交。

当您完成了以上步骤时,让我们在华为手机上运行这个应用吧!

初始运行界面

结果展示

发现餐厅及餐厅优惠信息:

干得好,你已经成功完成了Codelab并学到了:

现在,马上把您自己的创意用Nearby Service SDK来实现吧!

您可以阅读下面链接,了解更多相关的信息。
相关文档

您可以在Github上下载源码:

源码下载

已复制代码