2016-12-10 1 views
0

Wifi Direct를 사용하여 간단한 앱을 개발하려고합니다. 문제는 onPeersAvailable 메서드를 사용하여 사용 가능한 피어 목록을 가져올 수 없다는 것입니다. 나는 herehere을 언급했지만 로그에는 아무것도 없으며 로그 대신 토스트를 사용했지만 아무 것도 화면에 나타나지 않았습니다. 다음은 내 Main 및 BroadCastReceiver 클래스입니다.Android Wifi Direct onPeersAvailable에 아무 것도 표시되지 않습니다.

메인 클래스 :

public class MainActivity extends AppCompatActivity { 

private final String TAG = this.getClass().toString(); 

WifiP2pManager mManager; 
WifiP2pManager.Channel mChannel; 
BroadcastReceiver mReceiver; 
IntentFilter mIntentFilter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
    mChannel = mManager.initialize(this, getMainLooper(), null); 
    mReceiver = new WiFiDirectBroadcastReceiver(mManager, mChannel, this); 

    mIntentFilter = new IntentFilter(); 
    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); 

    Button btn_discover = (Button) findViewById(R.id.btn_discover); 
    btn_discover.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { 
       @Override 
       public void onSuccess() { 
        /*Toast.makeText(getApplicationContext(), "Discovery is a success.", 
          Toast.LENGTH_SHORT).show();*/ 
        //startActivity(new Intent(Settings.ACTION_WIRELESS_SETTINGS)); 
       } 

       @Override 
       public void onFailure(int reasonCode) { 
        Toast.makeText(getApplicationContext(), "Discovery is a failure "+reasonCode, 
          Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    }); 
} 

/* register the broadcast receiver with the intent values to be matched */ 
@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(mReceiver, mIntentFilter); 
} 
/* unregister the broadcast receiver */ 
@Override 
protected void onPause() { 
    super.onPause(); 
    unregisterReceiver(mReceiver); 
}} 

브로드 캐스트 리시버 클래스 :

public class WiFiDirectBroadcastReceiver extends BroadcastReceiver { 
private final String LOG_TAG = this.toString(); 
private WifiP2pManager mManager; 
private WifiP2pManager.Channel mChannel; 
private MainActivity mActivity; 

public WiFiDirectBroadcastReceiver(WifiP2pManager manager, WifiP2pManager.Channel channel, 
            MainActivity activity) { 
    super(); 
    this.mManager = manager; 
    this.mChannel = channel; 
    this.mActivity = activity; 
} 



@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 

    if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 
     int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1); 
     if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { 
      Log.i(LOG_TAG, "Wifi Direct is enabled"); 
     } else { 
      Log.i(LOG_TAG, "Wifi Direct is not enabled"); 
     } 
    } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
     // request available peers from the wifi p2p manager. This is an 
     // asynchronous call and the calling activity is notified with a 
     // callback on PeerListListener.onPeersAvailable() 
     if (mManager != null) { 
      mManager.requestPeers(mChannel, new WifiP2pManager.PeerListListener() { 
       @Override 
       public void onPeersAvailable(WifiP2pDeviceList wifiP2pDeviceList) { 
        Log.i(LOG_TAG, "Found some peers!!! "+wifiP2pDeviceList.getDeviceList().size()); 
       } 
      }); 
     } 
    } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { 
     // Respond to new connection or disconnections 
    } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { 
     // Respond to this device's wifi state changing 
    } 
}} 

내가 (안드로이드 4.4.4을 실행하는 2012 넥서스 7) 확실히 내 장치입니다은 와이파이 다이렉트를 지원합니다.

답변

0

"WiFiDirectBroadcastReceiver"안에 새로운 "PeerListListener"를 만들기 때문에 문제가 있다고 생각합니다. 가능한 동료를 듣고 주요 활동을

public class MainActivity extends AppCompatActivity implements WifiP2pManager.PeerListListener 

을 그리고 당신에게 새로운 방법을 추가 :

시도는 대신 주요 활동에 추가

@Override 
public void onPeersAvailable(WifiP2pDeviceList peerList) { 
    Log.i(LOG_TAG, "Found some peers!!! " + peerList.getDeviceList().size()); 
} 

참고 : 잊지 마세요 대신 "WiFiDirectBroadcastReceiver"라는 새로운 리스너 변수를 생성하고 주 활동을 참조로 전달하십시오.

희망이 도움이됩니다.

+0

이미이 솔루션을 사용해 보았지만 작동하지 않습니다. –

+0

흠 .. WiFi 직접 연결이 켜져 있습니까? GitHub에서 코드를 사용할 수 있다면 더 자세히 살펴볼 수 있습니다. 코드를 프로젝트에 복제하는 것에서부터 문제가되었습니다. – JAD

+0

나는 wifi-direct가 가능하다고 확신한다. [여기] (https://github.com/fthbrmnby/WirelessComChat)는 프로젝트의 GitHub 페이지입니다. –

관련 문제