2014-06-23 3 views
1

최근에 나는 다음과 같은 단계를 따른다. Developer.Android.ComWi-Fi (Android API)를 통해 다른 기기를 찾는 방법을 해결 하시겠습니까?

그러나 나는 거기에서 약간의 운이있는 것처럼 보인다. 근처에있는 동료를 찾으려고 시도했습니다. 을 arraylist에 넣었으나 운이없는 것 같습니다. 나는 아무것도 얻지 않았다.

내 실제 2 개 기기는 실제로 Android 4.1 및 4.2입니다. Wifi Direct는 API 레벨 14를 기반으로하므로 android 4.0 이상이므로 내 실제 기기는 문제가 아닌 것 같습니다.

내가 사용하는 개념은 이며 1 개의 활동과 1 개의 BroadCast Receiver를 사용합니다.

내 코드를 확인하십시오. 잘못 입력했거나 잊어 버렸습니까?

Chat1Activity.java

package com.example.androtut; 

import java.util.ArrayList; 

import others.MyBroadcastReceiver; 

import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 

import android.content.IntentFilter; 
import android.net.wifi.p2p.WifiP2pDeviceList; 
import android.net.wifi.p2p.WifiP2pManager; 
import android.net.wifi.p2p.WifiP2pManager.Channel; 
import android.net.wifi.p2p.WifiP2pManager.PeerListListener; 
import android.os.Bundle; 
import android.view.View; 

import android.widget.Button; 

import android.widget.Toast; 

public class Chat1Activity extends Activity { 

    private final IntentFilter mintentFilter = new IntentFilter(); 
    private Channel mChannel; 
    private WifiP2pManager mManager; 
    private BroadcastReceiver mReceiver; 
    private ArrayList peers = new ArrayList(); 
    private PeerListListener myPeerListListener = new PeerListListener() { 
     @Override 
     public void onPeersAvailable(WifiP2pDeviceList peerList) { 

      // Out with the old, in with the new. 
      peers.clear(); 
      peers.addAll(peerList.getDeviceList()); 

      // If an AdapterView is backed by this data, notify it 
      // of the change. For instance, if you have a ListView of available 
      // peers, trigger an update. 

      if (peers.size() == 0) { 
       Toast.makeText(getApplicationContext(),"Nothing found!", Toast.LENGTH_LONG).show(); 
       return; 
      } else { 
       Toast.makeText(getApplicationContext(),"We've found " + peers.size() + " users", Toast.LENGTH_LONG).show(); 
      } 


     } 
    }; 


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

     //Toast.makeText(getApplicationContext(), "Wifi is okay", Toast.LENGTH_LONG).show();  

     prepareIntentFilter(); 

     Button btn_startchat = (Button) findViewById(R.id.btn_startchat); 

     // Listening to News Feed button click 
     btn_startchat.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View view) { 
       // Launching News Feed Screen 
       detectPeers(); 
      } 
     }); 

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


    private void detectPeers(){ 

     mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { 

      @Override 
      public void onSuccess() { 
       // Code for when the discovery initiation is successful goes here. 
       // No services have actually been discovered yet, so this method 
       // can often be left blank. Code for peer discovery goes in the 
       // onReceive method, detailed below. 
      } 

      @Override 
      public void onFailure(int reasonCode) { 
       // Code for when the discovery initiation fails goes here. 
       // Alert the user that something went wrong. 
      } 
    }); 




    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     mReceiver = new MyBroadcastReceiver(mManager, mChannel, this, myPeerListListener); 
     registerReceiver(mReceiver, mintentFilter); 
    } 
    /* unregister the broadcast receiver */ 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(mReceiver); 
    } 

    private void prepareIntentFilter() { 

     mintentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); 
     // Indicates a change in the list of available peers. 
     mintentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 
     // Indicates the state of Wi-Fi P2P connectivity has changed. 
     mintentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 
     // Indicates this device's details have changed. 
     mintentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); 

    } 


} 

그리고

package others; 

import java.util.ArrayList; 

import com.example.androtut.Chat1Activity; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.wifi.p2p.WifiP2pDevice; 
import android.net.wifi.p2p.WifiP2pDeviceList; 
import android.net.wifi.p2p.WifiP2pManager; 
import android.net.wifi.p2p.WifiP2pManager.Channel; 
import android.net.wifi.p2p.WifiP2pManager.PeerListListener; 
import android.widget.Toast; 

public class MyBroadcastReceiver extends BroadcastReceiver { 

    private WifiP2pManager mManager; 
    private Channel mChannel; 
    private Chat1Activity mActivity; 
    private PeerListListener myPeerListListener; 



    public MyBroadcastReceiver(WifiP2pManager manager, Channel channel, 
      Chat1Activity activity, PeerListListener obPeerList) { 
     super(); 
     this.mManager = manager; 
     this.mChannel = channel; 
     this.mActivity = activity; 
     this.myPeerListListener = obPeerList; 
    } 

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

     if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 
      // Check to see if Wi-Fi is enabled and notify appropriate activity 
     } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
      // Call WifiP2pManager.requestPeers() to get a list of current peers 

      if (mManager != null) { 
       mManager.requestPeers(mChannel, myPeerListListener); 
      } 



     } 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 



     } 

     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) { 
       // Wifi P2P is enabled 
       Toast.makeText(mActivity.getApplicationContext(),"Wifi is okay", Toast.LENGTH_LONG).show(); 

      } else { 
       // Wi-Fi P2P is not enabled 
       Toast.makeText(mActivity.getApplicationContext(), 
         "Wifi is not okay", Toast.LENGTH_LONG).show(); 
      } 
     } 

    } 

} 
+1

안드로이드 폴더에 wifi 직접 데모가 있습니다.이 폴더로 이동할 수 있습니다 ..samples/android-14/WiFiDirectDemo – Hardik4560

+0

제안 사항 @ Hardik4560에 감사하지만 위 코드를 확인할 수 있습니까? – gumuruh

답변

-1

당신이 확인 했 MyBroadcastReceiver.java 장치 지원 와이파이 다이렉트 여부? rom> 4.0을 사용한다고해서 wifi 직접 하드웨어 지원이 가능하다는 의미는 아닙니다. PackageManager의 API로 확인해보십시오. http://developer.android.com/reference/android/content/pm/PackageManager.html#hasSystemFeature(java.lang.String)

+0

@jobcrazy, 대답을하기 전에 질문 코드를 확인하십시오 ..... bcoz from MyBroadcastReceiver.java 해당 지역의 무선 직접 기능이 테스트되었는지 여부를 볼 수 있습니다. 그 외의 것은 잊어 버려야합니다. – gumuruh

+0

Wi-Fi P2P 상태로 변경된 브로드 캐스트가 있음에도 불구하고 근처에 어떤 기기도 없거나 브로드 캐스트를 전혀받지 못했다는 뜻입니까? – jobcrazy

+0

다른 장치가 목록에 표시되지 않습니다. 코드를 확인하십시오 ...... 잊어 버린 것이 있습니까? – gumuruh

0

PeerListListener를 활동에 추가하지 않은 것 같습니다. 그래서 그것은 회답하지 않을 것이다.

당신이

if (mManager != null) { 
      mManager.requestPeers(mChannel, mActivity); 
} 

희망이 활동

public class Chat1Activity extends Activity implements WifiP2pManager.PeerListListener 

에 PeerListListener를 구현하고 활동에

@Override 
    public void onPeersAvailable(WifiP2pDeviceList peers) { 

    //put your code here 

    } 

을 onPeerAvailable 방법을 무시하고 리시버에 requestPeers 방법을 변경하려고 할 수 있습니다 도움!!