简介

近距离设备间数据传输(Nearby Connection):无需连接Internet,通过蓝牙、Wi-Fi等方式,发现并建立与其他设备的直接通信通道,支持无缝的近距离互动,例如本地多人游戏、协作白板和离线文件传输等。开发者可以针对不同开发场景,自由的选择通信数据类型。近距离设备间数据传输服务支持短文本、流数据和文件数据传输。通过示例工程,您可以体验到:

通过Nearby Connection实现一款简单的联机贪食蛇游戏

您将建立什么

在本篇codelab中,您将创建出一款使用华为近距离通信服务功能的联机游戏,可以通过Nearby Connection方便、快捷的让两台智能手机建立连接,进而完成两台手机的联机游戏。

您将会学到什么

硬件要求

软件要求

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

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

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

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

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

添加AGC配置文件

华为开发者联盟的AGC页面,选择"我的项目",在项目列表中找到您的项目,在项目下的应用列表中选择您的应用。选择"项目设置 > 常规",点击 "添加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。

加入混淆配置。

-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。Nearby Service SDK主要分为广播扫描模块,建立连接模块以及数据传输模块。
本小节您将尝试编写一个游戏,学会如何使用Nearby Service SDK的主要接口。您只需要按照下文的每一步提示,就可以边学边做,一起构建出这个游戏。

开源选型

由于我们只是为了演示如何使用Nearby Service实现游戏的网络通信,所以我们在GitHub上找到一款名为《Snake Land》的开源贪食蛇游戏,该工程采用MIT License,被许可人有权利使用、修改、出版发行、散布此软件。
我们将以此款游戏为模板,集成Nearby Service作为游戏的网络通信管道,实现联机对战功能。

Nearby Service的优势

《Snake Land》原先使用开源框架Kryonet实现网络通信层。
Kryonet介绍:https://github.com/EsotericSoftware/kryonet
Kryonet只支持连接同一路由器的手机设备之间互联。集成Nearby Service后,手机连接不同Wi-Fi、不连接Wi-Fi或者在飞机上开启飞行模式等场景下,都可以与附近的手机联机,实现真正的"靠近即连"。

如何使用Nearby Service

我们首先来看一下Kryonet与Nearby Service的接口对比:

API

Kryonet

Nearby Service

开始广播

bind

startBroadcasting

开始扫描

discoverHost

startScan

请求连接

connect

requestConnect

连接成功

connected

onResult

连接断开

disconnected

onDisconnected

收到数据

received

onReceived

发送数据

Send

sendData

从对比我们可以看出,Nearby Service和Kryonet的接口是一致的,因此我们要做的只是将Kryonet的接口替换为Nearby Service的接口,并根据参数类型的差异进行一些参数转换工作,您可以通过对比修改前后的源码了解具体细节。

权限申请

因为Nearby Service会用到蓝牙发现,Wi-Fi热点创建等操作,因此需要向用户显示申请一些权限。
首先,您需要修改应用的权限。修改app/src/main/目录下面的AndroidManifest.xml文件,在文件中添加以下六种权限。

代码如下:

<uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <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.ACCESS_FINE_LOCATION" />

添加权限申请函数

private void requestPermissions() { mPermissionHelper = new PermissionHelper(this, this); mPermissionHelper.requestPermissions(); } @Override public int getPermissionsRequestCode() { return 10086; } @Override public String[] getPermissions() { return new String[]{Manifest.permission.BLUETOOTH, Manifest.permission.BLUETOOTH_ADMIN, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION}; } @Override public void requestPermissionsSuccess() { } @Override public void requestPermissionsFail() { Toast.makeText(this, R.string.error_missing_permissions, Toast.LENGTH_LONG).show(); finish(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (mPermissionHelper.requestPermissionsResult(requestCode, permissions, grantResults)) { return; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }

编译、加载、调试

当您完成上述业务代码的补全之后,就可以进行编译。
完成编译后,生成APK,安装到两台Android 8以上的安卓手机,并运行。

当您完成了上述步骤时,让我们在两台手机上运行这个游戏吧!

游戏大厅界面介绍

一方点击"创建游戏",另一方点击"加入游戏",即开始互相发现。发现成功后,主机点击"GO!"按钮开始游戏。

游戏运行界面

滑动屏幕控制绿色小蛇转向,获取更多食物,小蛇头部撞到障碍即失败。

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

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

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

您可以在Github上下载源码:

源码下载

已复制代码