您的位置:首页 > 移动开发 > Android开发

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

2018-01-04 13:20 423 查看
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,则该设备接受所有连接请求。6NetworkRequest 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感知