欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

wi - fi感知 运行Android 8.0(API级别26)和更高的设备上

程序员文章站 2022-07-12 12:01:57
...

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





相关标签: wifi感知