Android wifi 传递数据

Android设备通过wifi传递数据在网上搜索有两种方式:
第一种是两台设备一台手机开热点给另外一个手机连接传递数据。
第二种是通过wifi direct来进行连接来传递数据。
第一种方式可以参考这个博客 http://blog.csdn.net/hudashi/article/details/25283087
本文主要讲第二种方式。
wifi direct 意思为wifi直连也就点对点的传输数据。通过 Android api里面 WifiP2pManager对象中的方法,以及监听广播可以达到通过wifi进行数据传递。
对于WifiP2pManager官方是这样介绍的:
This class provides the API for managing Wi-Fi peer-to-peer connectivity. This lets an application discover available peers, setup connection to peers and query for the list of peers. When a p2p connection is formed over wifi, the device continues to maintain the uplink connection over mobile or any other available network for internet connectivity on the device.
The API is asynchronous and responses to requests from an application are on listener callbacks provided by the application. The application needs to do an initialization with initialize(Context, Looper, WifiP2pManager.ChannelListener) before doing any p2p operation.
………
官方介绍的很仔细,大家也可以访问官方网站,英文不好的可以使用翻译工具翻译。

一、在我们的Activity中去初始化我们的IntentInfilter以及WifiP2pManager。当然首先需要在我们的清单文件中加上对应的权限:

        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        // add necessary intent values to be matched.
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
        intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
        intentFilter
                .addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
        intentFilter
                .addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);

        manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
        channel = manager.initialize(this, getMainLooper(), null);

二、通过BroadcastReceiver广播来监听我们的wifi变化从而来做出想对应的操作,自己定义一个类继承BroadcastReceiver重写onReceive方法。在onReceive()方法中:

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {

            // UI update to indicate wifi p2p status.
            int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1);
            if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {
                // Wifi Direct mode is enabled
                activity.setIsWifiP2pEnabled(true);
            } else {
                activity.setIsWifiP2pEnabled(false);
                activity.resetData();

            }
            Log.d(WiFiDirectActivity.TAG, "P2P state changed - " + state);
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            // request available peers from the wifi p2p manager. This is an
            // asynchronous call and the calling activity is notified with a
            // callback on PeerListListener.onPeersAvailable()
            Log.d(WiFiDirectActivity.TAG, "P2P peers changed");

        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION
                .equals(action)) {

            if (manager == null) {
                return;
            }
            NetworkInfo networkInfo = (NetworkInfo) intent
                    .getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
            if (networkInfo.isConnected()) {
                // we are connected with the other device, request connection
                // info to find group owner IP

                DeviceDetailFragment fragment = (DeviceDetailFragment) activity
                        .getFragmentManager()
                        .findFragmentById(R.id.frag_detail);
                manager.requestConnectionInfo(channel, fragment);
            } else {
                // It's a disconnect
                activity.resetData();
            }

        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION
                .equals(action)) {
            DeviceListFragment fragment = (DeviceListFragment) activity
                    .getFragmentManager().findFragmentById(R.id.frag_list);
            fragment.updateThisDevice((WifiP2pDevice) intent
                    .getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE));
        }
    }

三、在Activity中的生命周期方法中注册和反注册我们的广播

    @Override
    public void onResume() {
        super.onResume();
        // WiFiDirectBroadcastReceiver parameter is Initialization parameter 
        receiver = new WiFiDirectBroadcastReceiver(manager, channel, this);
        registerReceiver(receiver, intentFilter);
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }

五、通过WifiP2pManager查找设备,当查找到设备时就会调用WifiP2pManager.PeerListListener接口中的onPeersAvailable()方法。

     // 点击时触发
     manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
                    @Override
                    public void onSuccess() {
                        // 方法可以空实现
                        Toast.makeText(WiFiDirectActivity.this,
                                "Discovery Initiated", Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onFailure(int reasonCode) {
                        Toast.makeText(WiFiDirectActivity.this,
                                "Discovery Failed : " + reasonCode,
                                Toast.LENGTH_SHORT).show();
                    }
                });

六、在实现了WifiP2pManager.PeerListListener接口的类中找到onPeersAvailable()方法,我们可以在这个方法中做一些操作,将获取到的设备添加到一个ListView中。

 @Override
    public void onPeersAvailable(WifiP2pDeviceList peerList) {
        // 关闭对话框
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        // 将之前的状态进行清除
        peers.clear();
        // 将获取到的可匹配设备加到listView中
        peers.addAll(peerList.getDeviceList());
        // 此时就会在广播中就会收到一个带有 WIFI_P2P_PEERS_CHANGED_ACTION 动作的广播
        ((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
        if (peers.size() == 0) {
            Log.e(WiFiDirectActivity.TAG, "No devices found");
            return;
        }
    }

    // 清除上一次的可连接设备
    public void clearPeers() {
        peers.clear();
        ((WiFiPeerListAdapter) getListAdapter()).notifyDataSetChanged();
    }

七、此时在BroadcastReceiver中就会收到一条 WIFI_P2P_PEERS_CHANGED_ACTION 动作的意图的广播,在上面中添加如下代码:

    // 表示找到了匹配的设备,在这里我们发起请求
    if (manager != null) {
         manager.requestPeers(channel, (PeerListListener) activity
                 .getFragmentManager().findFragmentById(R.id.frag_list));
     }

八、接下来就是连接我们的设备了

        WifiP2pConfig config = new WifiP2pConfig();  
        config.deviceAddress = device.deviceAddress;  
        config.wps.setup = WpsInfo.PBC;  
        mManager.connect(mChannel, config, new ActionListener() {  
            @Override  
            public void onSuccess() {  
            // WiFiDirectBroadcastReceiver将会通知我们。现在可以先忽略。  
            }  

            @Override  
            public void onFailure(int reason) {  
                Toast.makeText(WiFiDirectActivity.this, "Connect failed. Retry.",  
                        Toast.LENGTH_SHORT).show();  
            }  
        });  

上述就是我们Wifi Direct连接的整个流程了,有写的不好的或者有哪里不懂的可以留言往指正。

猜你喜欢

转载自blog.csdn.net/weixin_37185329/article/details/72902386