最近的项目需要实现一个安卓手机之间无网络传输文件的功能,就发现了Wifi P2P(无线点对点)这么一个功能,最后也实现了通过Wifi隔空传输文件的功能,这里我也来整理下代码,分享给大家。
Wifi P2P是在Android 4.0以及更高版本系统中加入的功能,通过Wifi P2P可以在不连接网络的情况下,直接与配对的设备进行数据交换。相对于蓝牙,Wifi P2P的搜索速度和传输速度更快,传输距离更远
实现的效果如下所示:
客户端png
服务器端使用
一般而言,开发步骤分为以下几点:
-
<李>在AndroidManifest中声明相关权限(网络和文件读写权限)李>
<李>获取WifiP2pManager,注册相关广播监听Wifi直连的状态变化李>
<李>指定某一台设备为服务器(用来接收文件),创建群组并作为群主存在,在指定端口监听客户端的连接请求,等待客户端发起连接请求以及文件传输请求李>
<李>客户端(用来发送文件)主动搜索附近的设备,加入到服务器创建的群组,获取服务器的IP地址,向其发起文件传输请求李>
<李>校验文件完整性李>
Wifi P2P技术并不会访问网络,但由于会使用到Java socket,所以需要申请网络权限。此外,由于是要实现文件互传,所以也需要申请SD卡读写权限。
& lt; uses-permission android: name=" android.permission。ACCESS_WIFI_STATE”/比; & lt; uses-permission android: name=" android.permission。CHANGE_WIFI_STATE”/比; & lt; uses-permission android: name=" android.permission。CHANGE_NETWORK_STATE”/比; & lt; uses-permission android: name=" android.permission。互联网”/比; & lt; uses-permission android: name=" android.permission。ACCESS_NETWORK_STATE”/比; & lt; uses-permission android: name=" android.permission。WRITE_EXTERNAL_STORAGE”/比; & lt; uses-permission android: name=" android.permission。READ_EXTERNAL_STORAGE "/祝辞
与Wifi P2P相关的广播有以下几个:
-
<李> WIFI_P2P_STATE_CHANGED_ACTION(用于指示Wifi P2P是否可用)李>
<李> WIFI_P2P_PEERS_CHANGED_ACTION(对等节点列表发生了变化)李>
<李> WIFI_P2P_CONNECTION_CHANGED_ACTION (Wifi P2P的连接状态发生了改变)李>
<李> WIFI_P2P_THIS_DEVICE_CHANGED_ACTION(本设备的设备信息发生了变化)李>
当接收到这几个广播时,我们都需要到WifiP2pManager(对等网络管理器)来进行相应的信息请求,此外还需要用到通道对象作为请求参数
mWifiP2pManager=(WifiP2pManager) getSystemService (Context.WIFI_P2P_SERVICE); mChannel=mWifiP2pManager。初始化(这,getMainLooper(),这一点);
当收到WifiP2pManager。WIFI_P2P_STATE_CHANGED_ACTION广播时,可以判断当前Wifi P2P是否可用
int状态=intent.getIntExtra (WifiP2pManager。EXTRA_WIFI_STATE, 1); 如果(状态==WifiP2pManager.WIFI_P2P_STATE_ENABLED) { mDirectActionListener.wifiP2pEnabled(真正的); 其他}{ mDirectActionListener.wifiP2pEnabled(假); } >之前当收到WifiP2pManager。WIFI_P2P_PEERS_CHANGED_ACTION广播时,意味设备周围的可用设备列表发生了变化,可以通过requestPeers方法得到可用的设备列表,之后就可以选择当中的某一个设备进行连接操作
mWifiP2pManager。requestPeers (mChannel,新的WifiP2pManager.PeerListListener () { @Override 公共空间> NetworkInfo NetworkInfo=intent.getParcelableExtra (WifiP2pManager.EXTRA_NETWORK_INFO); 如果(networkInfo.isConnected ()) { mWifiP2pManager。requestConnectionInfo (mChannel,新的WifiP2pManager.ConnectionInfoListener () { @Override 公共空间> 公共接口DirectActionListener WifiP2pManager延伸。ChannelListener { 空白wifiP2pEnabled(布尔启用); 空白>/* * * chenZY *时间:2018/2/9 17:53 *描述: */公开课DirectBroadcastReceiver BroadcastReceiver{延伸 私有静态最终字符串标签=癉irectBroadcastReceiver”; 私人WifiP2pManager mWifiP2pManager; 私人WifiP2pManager。通道mChannel; 私人DirectActionListener mDirectActionListener; 公共DirectBroadcastReceiver (WifiP2pManager WifiP2pManager WifiP2pManager。频道频道,DirectActionListener DirectActionListener) { mWifiP2pManager=wifiP2pManager; mChannel=通道; mDirectActionListener=directActionListener; } 公共静态IntentFilter getIntentFilter () { IntentFilter IntentFilter=new IntentFilter (); 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); 返回intentFilter; } @Override 公共空间> wifiP2pManager。createGroup(渠道,新WifiP2pManager.ActionListener () { @Override 公共空间> @Override 保护空白> 公共类FileTransfer实现Serializable {//文件路径 私人字符串filePath;//文件大小 私人长fileLength;//MD5码 私人字符串md5; ··· }Android实现无网络传输文件的示例代码