wi - fi感知 运行Android 8.0(API级别26)和更高的设备上
1:应用程序清单中请求以下权限: manifest
<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" />2:通过调用PackageManager来检查设备是否支持wi - fi
context.getPackageManager.hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE);
3:注册一个广播接收器来接收
IntentFilter filter = new IntentFilter(WifiAwareManager.WIFI_AWARE_STATE_CHANGED_ACTION); BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { if (WifiAwareManager.isAvailable()) { ... } else { ... } } }; context.registerReceiver(myReceiver, filter);
要开始使用wi - fi,你的应用必须通过调用attach()获得WifiAwareSession。该方法如下:
打开wi - fi感知硬件。
如果没有集群,则形成一个集群。
创建一个具有唯一名称空间的wi - fi感知会话,该名称空间充当在其中创建的所有发现会话的容器。
如果应用程序成功连接,系统将执行onAttached()回调。这个回调提供了一个WifiAwareSession对象,您的应用程序应该用于所有其他会话操作。应用程序现在可以使用会话发布服务或订阅服务。
你的应用程序应该调用attach()一次。如果您多次调用attach(),您的应用程序将接收不同的会话,每个会话都有自己的名称空间。这在复杂的场景中可能有用,但通常应该避免。
注意:只要有活动会话,系统就会保持与wi - fi集群的同步。这种集群消耗资源和电池。为了节约资源,在不需要会话的时候调用wifiawaresession . close()。
3: 发现服务
PublishConfig config = new PublishConfig.Builder()
.setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
.build();
mAwareSession.publish(config, new DiscoverySessionCallback() {
@Override
public void onPublishStarted(PublishDiscoverySession session) {
...
}
@Override
public void onMessageReceived(PeerHandle peerHandle, byte[] message) {
...
}, null);
4:订阅服务
SubscribeConfig config = new SubscribeConfig.Builder()
.setServiceName(AWARE_FILE_SHARE_SERVICE_NAME)
.build();
mAwareSession.subscribe(config, new DiscoverySessionCallback() {
@Override
public void onSubscribeStarted(SubscribeDiscoverySession session) {
....
}
@Override
public void onServiceDiscovered(PeerHandle peerHandle,
byte[] serviceSpecificInfo, List<byte[]> matchFilter) {
...
}
}, null);
要向另一个设备发送消息,您需要以下对象:
DiscoverySession。该对象允许您调用sendMessage()。通过发布服务或订阅服务,您的应用程序将获得一个DiscoverySession。
另一个设备的PeerHandle,所以你知道在哪里发送消息。你的应用程序可以通过以下两种方式获得另一个设备的PeerHandle:
你的应用程序发布一个服务。然后,当从订阅服务器接收消息时,应用程序从onMessageReceived()回调获取用户的PeerHandle。
你的app订阅了一项服务。然后,当它发现一个匹配的发布者时,您的应用程序从onServiceDiscovered()回调中获得了发布者的PeerHandle。
要发送消息,请调用sendMessage()。然后可能会出现以下回调:
当消息被对等方成功接收后,系统将在发送应用程序中执行onmessagesendUNK()回调。
当对等点接收到一条消息时,系统将在接收应用程序中执行onMessageReceived()回调。
注意:消息通常用于轻量级消息传递,因为它们可能不会传递,而且长度限制在255字节。确定确切的长度限制,叫getMaxServiceSpecificInfoLength()。对于高速、双向通信,你的应用应该创建一个连接
5
创建一个网络说明符:
wi - fi清楚发现,叫DiscoverySession.createNetworkSpecifierOpen()或DiscoverySession.createNetworkSpecifierPassphrase从发布者和订阅者()。
OOB发现,叫WifiAwareSession.createNetworkSpecifierOpen()或WifiAwareSession.createNetworkSpecifierPassphrase设备()。
应答器不需要提供MAC地址或PeerHandle。如果没有指定MAC地址或PeerHandle,则该设备接受所有连接请求。
6
NetworkRequest myNetworkRequest = new NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE) .setNetworkSpecifier(networkSpecifier) .build();
7:
mCallback = new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { ... } @Override public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { ... } @Override public void onLost(Network network) { ... } }; mConnMgr.requestNetwork(networkRequest, mCallback);
9:当你完成网络连接,叫unregisterNetworkCallback()。
上一篇: 李航统计学习方法-感知机python实现
下一篇: leetcode第6双周赛