Android WiFi Direct文件傳輸

1.說明

最近寫個應用,需要用到wifi direct(Android中也叫WifiP2P)進行文件傳輸,其中,主要的實現流程官方文檔有介紹,這裏不再贅述。具體實現,參考了這位大佬的。

2.注意事項

2.1 確保申請必要權限

下列的權限都是必要的,確保都申請了

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <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_NETWORK_STATE" />
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

如果缺少了其中的某項權限,可能會出現一些問題,比如缺少ACCESS_COARSE_LOCATION,在部分機器上,可能會出現無法搜索到設備的情況。

2.2 使用startService

github leavesC 這位大佬啓動WifiServerService使用的是bindService的方式,不過,我們的 WifiServerService是繼承自IntentService 的,所以,直接用startService即可。

2.3 從group owner 發送數據到client

在WifiServerService的onHandleIntent中, Socket client = serverSocket.accept();接收到客戶端連接後,可以使用client.getInetAddress().getHostAddress()獲取到client的地址。獲取到地址後,group owner端可以使用此地址連接到client。不過確保client端的WifiServerService是正常運行的,即確保ServerSocket開啓了,並且正常accept。

可以寫一個如下的方法

private void sendFileToIp(File file,String ip) {
        if(file.exists() && mWifiP2pInfo != null) {
            FileTransferBean fileTransferBean =
                    new FileTransferBean(file.getPath(),file.length());
            Log.d(TAG, "sendFileToIp: file to client:"+fileTransferBean);

            new FileSendTask(this,fileTransferBean).execute(ip);
        }
    }

發送文件到p2p網絡中指定ip的機器。其中FileSendTask是用來發送文件的內部類,在DeviceActivity中。

2.4 設備差異

有的設備需要手動打開wifi direct才能搜索得到,有的設備只需要打開wifi就可以。如果設備搜索不到,可以在設備上選擇一個文件分享,在分享方式中選擇wifi direct,然後就會進入到你的手機系統提供的wifi direct的搜索界面,這個時候,再用你寫的app搜索試試。需要注意的是,兩臺設備都要在搜索狀態下,才能發現互相發現。

3.代碼

代碼放在gitee上,需要的同學可以前往自取。
在這裏插入圖片描述
搜索設備的界面如上圖所示,搜索到設備後,點擊設備列表的右上角的按鈕,然後,選擇連接,連接成功後,如果當前設備是發送端,就可以點擊發送
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章