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()。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值