我正在尝试使用Wi-Fi Direct连接两个Android设备。
在我的HTC手机(一SV)上,它似乎可以工作,但在我的第二台设备LG Optimus 4xhd上,它不工作。
在onResume()函数中,我启动以下线程:
new Thread(){
private int count=0;
public void run()
{
mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Log.d(tag,"SUCCESS - started discovering peers");
}
@Override
public void onFailure(int reason) {
count++;
String err=new String();
if(reason==WifiP2pManager.BUSY) err="BUSY";
if(reason==WifiP2pManager.ERROR)err="ERROR";
if(reason==WifiP2pManager.P2P_UNSUPPORTED) err="P2P_UNSUPPORTED";
Log.d(tag,"FAIL - couldnt start to discover peers code: "+err+" ("+count+")");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(count>=20)return;
mManager.discoverPeers(mChannel, this);
}
});
}
}.start();
正如我之前所说:这在我的HTC上运行良好。但对于LG,我只得到了"失败-无法开始发现同行代码:忙"(20次)。
我还尝试了WifiP2pManager.createGroup(),得到了相同的结果。
我意识到的另一件事是,我的带有以下过滤器的BroadcastReceiver在我的LG上没有接收到任何东西(HTC得到了一些广播)。过滤器:
filter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
// Indicates a change in the list of available peers.
filter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
// Indicates the state of Wi-Fi P2P connectivity has changed.
filter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
// Indicates this device's details have changed.
filter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
我没有尝试任何新奇的东西。我只是按照Api指南上的Wi-Fi Directhttp://developer.android.com/guide/topics/connectivity/wifip2p.html
我能做什么吗?我不明白为什么LG手机的工作方式会如此不同。
只是为了确保最后一件事:在我的onCreate()中,我得到并初始化我的经理,如下所示:
mManager = (WifiP2pManager) getSystemService(MainActivity.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), receiver);
它似乎在这两种设备上都有效。(我得到一个通道返回)
您使用mainLooper
,因此不要创建任何线程并执行所有操作,而是执行以下操作:
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
switch(item.getItemId()){
case R.id.search_devices:
if(!isWifiP2pEnabled){
Toast.makeText(this, "enable wifi p2p", Toast.LENGTH_LONG).show();
return true;
}
onInitiateDiscovery();
manager.discoverPeers(channel, MainActivity.this);
default:
return super.onOptionsItemSelected(item);
}