欢迎光临
我们一直在努力

Android WiFi Direct文件传输,文件传输助手片

Android WiFi Direct文件传输 1.说明2.注意事项2.1 确保申请必要权限2.2 使用startService2.3 从group owner 发送数据到client2.4 设备差异 3.代码

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上,需要的同学可以前往自取。

搜索设备的界面如上图所示,搜索到设备后,点击设备列表的右上角的按钮,然后,选择连接,连接成功后,如果当前设备是发送端,就可以点击发送

赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。