Почему я всегда получаю BUSY при использовании WifiP2pManager?

Я пытаюсь подключить два Android-устройства с помощью Wi-Fi Direct.

На моем HTC-Phone (One 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 Direct на http://developer.android.com/guide/topics/connectivity/wifip2p.html

Могу ли я что-нибудь сделать? Я не могу понять, почему LG-Phone должен работать по-другому.

Просто чтобы убедиться в одном: в моем onCreate() я получаю и инициирую свой менеджер следующим образом:

 mManager = (WifiP2pManager) getSystemService(MainActivity.WIFI_P2P_SERVICE);
    mChannel = mManager.initialize(this, getMainLooper(), receiver);

И вроде работает на обоих устройствах. (Я возвращаю канал)


person LibettenRadler    schedule 05.08.2013    source источник
comment
У вас есть какое-либо решение для этого?   -  person OMAK    schedule 27.03.2014


Ответы (1)


вы используете 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);

        }
person Rayyan    schedule 07.01.2014