Android实现无网络传输文件的示例代码

  

最近的项目需要实现一个安卓手机之间无网络传输文件的功能,就发现了Wifi P2P(无线点对点)这么一个功能,最后也实现了通过Wifi隔空传输文件的功能,这里我也来整理下代码,分享给大家。

  

Wifi P2P是在Android 4.0以及更高版本系统中加入的功能,通过Wifi P2P可以在不连接网络的情况下,直接与配对的设备进行数据交换。相对于蓝牙,Wifi P2P的搜索速度和传输速度更快,传输距离更远

  

实现的效果如下所示:

  

 Android实现无网络传输文件的示例代码

  

客户端png

  

 Android实现无网络传输文件的示例代码

  

服务器端使用

  

一般而言,开发步骤分为以下几点:

  
      <李>在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实现无网络传输文件的示例代码