android4.0以后增加了wifidirect直接连接,两台手机可以通过wifidirect直接连接,方便快速传递东西。
其中涉及到了几个常用的类
WifiP2pDevice表示具体的wifi设备
WifiManager用于代开关闭wifi状态的
WifiP2pManager用来控制整个连接过程操作的类
WifiP2pInfo用于获取连接设备信息的类
具体流程:
首先自定义一个广播接收者,用于监听mWifiP2pManager.initialize(MainActivity.this,getMainLooper(),null);返回的wifidirect状态,包含四个action,WifiDirectBroadReceiver.java
@Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub String action = intent.getAction(); if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {//P2P功能是否打开 int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE,-1);// EXTRA_WIFI_STATE 为发现wifi P2p是否可见的key if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { Log.d(TAG, "t"+state); }else{ Log.d(TAG, "f"+state); } } if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {// 发现对等p2p if (manager != null) { manager.requestPeers(channel, (PeerListListener)activity);// Log.d(TAG, "WIFI_P2P_PEERS_CHANGED_ACTION请求当前对等信息执行"); } } if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {//显示自己p2p信息 activity.updateThisDevice((WifiP2pDevice) intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE)); Log.d(TAG,"显示自己的设备信息"); } if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {//连接action if (null == manager) { return; } NetworkInfo netWorkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO); if (netWorkInfo.isConnected()) { manager.requestConnectionInfo(channel,(ConnectionInfoListener)activity); }else { activity.resetData(); } } }新建类FindPeers实现PeerListListener接口,当搜索到可用的wifi设备时候,回调onPeersAvailable(WifiP2pDeviceList deviceList)方法
FindPeers.java
public class FindPeers implements PeerListListener { private static final String TAG = "findpeers"; private List<WifiP2pDevice>list = new ArrayList<WifiP2pDevice>(); private ProgressDialog progressDialog = null; private Context context; private WifiManager manager; private ListView listView; private Handler handler; public FindPeers(Context context,Handler handler) { this.context = context; manager = (WifiManager) context.getSystemService(context.WIFI_SERVICE); this.handler = handler; } /** * 搜索对等的peers 启动WIFI_P2P_STATE_ENABLED action */ @Override public void onPeersAvailable(WifiP2pDeviceList deviceList) { list.clear(); list.addAll(deviceList.getDeviceList()); handler.sendEmptyMessage(1); } public boolean isWifiEnable() { if (manager != null) { return manager.isWifiEnabled(); }else{ return false; } } public void openWifi() { manager.setWifiEnabled(true); } public List<WifiP2pDevice> getP2pDevice() { return list; } }
MainActivity.java
package com.example.wifidirect; import java.util.ArrayList; import java.util.List; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.wifi.WifiManager; import android.net.wifi.WpsInfo; import android.net.wifi.p2p.WifiP2pConfig; import android.net.wifi.p2p.WifiP2pDevice; import android.net.wifi.p2p.WifiP2pDeviceList; import android.net.wifi.p2p.WifiP2pInfo; import android.net.wifi.p2p.WifiP2pManager; import android.net.wifi.p2p.WifiP2pManager.ActionListener; import android.net.wifi.p2p.WifiP2pManager.ChannelListener; import android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener; import android.net.wifi.p2p.WifiP2pManager.PeerListListener; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.telephony.TelephonyManager; import android.util.Log; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity implements PeerListListener,ConnectionInfoListener,ChannelListener { private static final String TAG = "MainActivity"; private final IntentFilter mIntentFilter = new IntentFilter(); private WifiP2pManager mWifiP2pManager; //连接设备信息 private WifiP2pInfo mInfo; private boolean isP2pEnabled = false; private List<WifiP2pDevice> mpeers =new ArrayList<WifiP2pDevice>(); private ProgressDialog mProgressDialog = null; private WifiP2pDevice mWifiP2pDevice; private WifiP2pManager.Channel mChannel; private ListView mListView ; WifiPeerListAdapter adapter; private Button mSearchBtn; private FindPeers findPeers; private boolean retryChanel = false; private WifiDirectBroadReceiver mReceiver; /**自己设备的状态 */ private String mStatus = "avaliable"; private TextView mRename; private static final int DIALOG_DISCONNECT = 1; private static final int DIALOG_CANCEL_CONNECT = 2; private static final int DIALOG_RENAME = 3; String deviceName = "temp"; Handler mHandler = new Handler() { public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: setAdapter(); break; default: break; } }; }; @SuppressLint("ShowToast") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); init(); /**可以探测到有效距离内的对等设备*/ mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() {//只会对成功探测到对等设备这一事件做出通知,而并不会提供任何关于已发现的对等设备的具体信息: } @Override public void onFailure(int arg0) { // TODO Auto-generated method stub } }); } private void init() { mListView = (ListView) findViewById(R.id.lv); mRename = (TextView) findViewById(R.id.rename); mSearchBtn = (Button) findViewById(R.id.search); findPeers = new FindPeers(MainActivity.this,mHandler); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); mIntentFilter .addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); mIntentFilter .addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); mWifiP2pManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE); if (null != mWifiP2pManager) { mChannel = mWifiP2pManager.initialize(MainActivity.this,getMainLooper(),null); if (mChannel == null) { Log.d(TAG,"setup connection fail"); mWifiP2pManager = null; } }else{ Log.d(TAG, "mWifiP2pManager is null"); } mSearchBtn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (!findPeers.isWifiEnable()) { findPeers.openWifi(); } mpeers.clear(); setAdapter(); mWifiP2pManager.discoverPeers(mChannel, new ActionListener() { @Override public void onSuccess() { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,"discover success",Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,"discover fail",Toast.LENGTH_SHORT).show(); } }); } }); } /** * 自定义显示adapter * @author user * */ private class WifiPeerListAdapter extends ArrayAdapter<WifiP2pDevice> { private List<WifiP2pDevice>items; public WifiPeerListAdapter(Context context, int textViewResourceId, List<WifiP2pDevice> objects) { super(context, textViewResourceId, objects); items = objects; } public List<WifiP2pDevice> getItems() { return items; } @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (null == v) { v = LayoutInflater.from(MainActivity.this).inflate(R.layout.row_devices1,null); } final WifiP2pDevice deviceInfo = items.get(position); if (deviceInfo != null) { TextView deviceName = (TextView) v.findViewById(R.id.device_name); TextView deviceDetail = (TextView) v.findViewById(R.id.device_details); if (null != deviceName) { deviceName.setText(deviceInfo.deviceName); } if (null != deviceDetail) { deviceDetail.setText(getStateStatus(deviceInfo.status)); } final Button connect = (Button) v.findViewById(R.id.connect); if ("avaliable".equalsIgnoreCase(getStateStatus(deviceInfo.status))) { connect.setText("链接"); } if ("connnected".equalsIgnoreCase(getStateStatus(deviceInfo.status))) { connect.setText("断开"); } connect.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub if (connect.getText().equals("链接")) { connect(createP2pConfig(deviceInfo)); } if (connect.getText().equals("断开")) { cancleConnect(deviceInfo); } } }); } return v; } } /** * 得到链接的状态 * @param deviceStatus * @return */ private static String getStateStatus(int deviceStatus) { switch (deviceStatus) { case WifiP2pDevice.AVAILABLE: return "avaliable"; case WifiP2pDevice.CONNECTED: return "connnected"; case WifiP2pDevice.FAILED: return "failed"; case WifiP2pDevice.INVITED: return "invited"; case WifiP2pDevice.UNAVAILABLE: return "unavailable"; default: return "unknow"; } } /** * 连接指定的peer * @param config */ public void connect(WifiP2pConfig config) { mWifiP2pManager.connect(mChannel, config, new ActionListener() { @Override public void onSuccess() { // TODO Auto-generated method stub // Log.d(TAG, "链接到设备:"+mWifiP2pDevice.deviceName+"ipaddress:"+mWifiP2pDevice.deviceAddress); } @Override public void onFailure(int arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,"connectfail",Toast.LENGTH_SHORT).show(); } }); } /** * 根据device的信息,创建配置信息 * @param device * @return */ public WifiP2pConfig createP2pConfig(WifiP2pDevice device) { WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress; config.wps.setup = WpsInfo.PBC; return config; } public void cancleConnect(WifiP2pDevice device) { if (null != mWifiP2pManager) { if (device == null || device.status == WifiP2pDevice.CONNECTED) { disConnect(); }else if (device.status == WifiP2pDevice.AVAILABLE || device.status == WifiP2pDevice.INVITED) { mWifiP2pManager.cancelConnect(mChannel, new ActionListener() { @Override public void onSuccess() { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,"cancleConnect success",Toast.LENGTH_LONG).show(); } @Override public void onFailure(int arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,"cancleconnect fail error"+arg0,Toast.LENGTH_LONG).show(); } }); } } } /** * 断开连接 */ public void disConnect() { mWifiP2pManager.removeGroup(mChannel, new ActionListener() { @Override public void onSuccess() { // TODO Auto-generated method stub mpeers.clear(); setAdapter(); } @Override public void onFailure(int arg0) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this,"disconnect fail error"+arg0,Toast.LENGTH_LONG).show(); } }); } public void setAdapter() { if (null == adapter) { adapter = new WifiPeerListAdapter(MainActivity.this,R.layout.row_devices,mpeers); mListView.setAdapter(adapter); }else{ for (WifiP2pDevice device: mpeers) { String name = device.deviceName; String sta = getStateStatus(device.status); } ((WifiPeerListAdapter)mListView.getAdapter()).notifyDataSetChanged(); } } /** * action WIFI_P2P_THIS_DEVICE_CHANGED_ACTION检测自身device 显示自身设备信息 * @param device */ public void updateThisDevice(WifiP2pDevice device) { this.mWifiP2pDevice = device; TextView viewOne = (TextView) this.findViewById(R.id.tv); TextView viewTwo = (TextView) this.findViewById(R.id.tv1); String name = device.deviceName; String status = device.status+""; viewOne.setText(device.deviceName); viewTwo.setText(getStateStatus(device.status)); mStatus = getStateStatus(device.status); Log.d(TAG, "连接前自己的地址"+device.deviceAddress); } /** * 清空自身信息 */ public void resetData() { mWifiP2pDevice = null; mpeers.clear(); setAdapter(); } @Override protected void onResume() { super.onResume(); if (mReceiver == null) { mReceiver = new WifiDirectBroadReceiver(mWifiP2pManager, mChannel, this, findPeers); } registerReceiver(mReceiver, mIntentFilter); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); if (mWifiP2pManager != null) { mWifiP2pManager.stopPeerDiscovery(mChannel, null); } unregisterReceiver(mReceiver); } @Override public void onPeersAvailable(WifiP2pDeviceList deviceList) { // TODO Auto-generated method stub mpeers.clear(); mpeers.addAll(deviceList.getDeviceList()); ((WifiPeerListAdapter)mListView.getAdapter()).notifyDataSetChanged(); if (mpeers.size() == 0) { Log.d(TAG, "no peer found"); } mHandler.sendEmptyMessage(1); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK) { if (mStatus.equalsIgnoreCase("Connect")) { disConnect(); } } return super.onKeyDown(keyCode, event); } @Override public void onChannelDisconnected() { // TODO Auto-generated method stub if (mWifiP2pManager != null || ! retryChanel) { resetData(); retryChanel = true; mWifiP2pManager.initialize(MainActivity.this,getMainLooper(),this); } } @Override public void onConnectionInfoAvailable(WifiP2pInfo arg0) { // TODO Auto-generated method stub } }