2012-10-25 28 views
5

Tôi đang phát triển một ứng dụng đơn giản dựa trên WiFi Direct cho Android có kết nối hai thiết bị. Để làm như vậy tôi cần phải gọi đến función onPeersAvailable (myPeerListListener), nhưng tôi không biết làm thế nào.Android Wi-Fi Direct: onPeersAvailable

Ứng dụng của tôi có này hai yếu tố: Hoạt động

1-Main:

package android.nacho.WifiDirect; 



import android.net.wifi.p2p.WifiP2pManager.Channel; 

import android.net.wifi.p2p.WifiP2pManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class WifiDirect extends Activity { 


    WifiP2pManager mManager; 
    Channel mChannel; 
    BroadcastReceiver mReceiver; 

    IntentFilter mIntentFilter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_wifi_direct); 


     //To register the BroadastReceiver 
     mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); 
     mChannel = mManager.initialize(this, getMainLooper(), null); //It was necessary to make a cast (Channel) 
     mReceiver = new WiFiBroadcastReceiver(mManager, mChannel, this); //, this); 

     //Layout 
     final Button btnScan = (Button)findViewById(R.id.btnScan); 
     final TextView TextDebug=(TextView)findViewById(R.id.TextDebug); 


     //To define the filter in the BroadcastReceiver 
     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); 




     final OnClickListener ScanListener=new OnClickListener() //Sacado de TEstPsycologico 
     { 
      public void onClick(View v){ 



       TextDebug.setText("Se intentan buscar Peers"); 

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


        public void onSuccess() { 

         TextDebug.setText("Ha habido éxito buscando Peers");//DEBUG: Para ver si es posible encontrar Peers 

        } 


        public void onFailure(int reasonCode) { 

         TextDebug.setText("Algo ha salido mal buscando Peers"); //DEBUG: Para ver si pasó algo raro busando Peers 
        } 
       }); 


       onPeersAvailable(myPeerListListener); 

      } 


     }; 

     btnScan.setOnClickListener(ScanListener); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.activity_wifi_direct, menu); 
     return true; 
    } 

    // 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     registerReceiver(mReceiver, mIntentFilter); 
    } 

    // unregister the broadcast receiver 
    @Override 
    protected void onPause() { 
     super.onPause(); 
     unregisterReceiver(mReceiver); 
    } 

} 

2 Lớp BroadcastReceiver:

package android.nacho.WifiDirect; 

import android.net.wifi.p2p.WifiP2pManager.Channel; 
import android.net.wifi.p2p.WifiP2pManager.PeerListListener; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.net.wifi.p2p.WifiP2pManager; 
import android.widget.Toast; 



/** 
* A BroadcastReceiver that notifies of important Wi-Fi p2p events. 
*/ 

public class WiFiBroadcastReceiver extends BroadcastReceiver { 

    private WifiP2pManager manager; 
    private Channel channel; 
    private WifiDirect activity; 
    private PeerListListener myPeerListListener; 

    //For toast, add also context 
    //private Context context; 

    public WiFiBroadcastReceiver(WifiP2pManager manager, Channel channel, WifiDirect activity){//, Context context) { 

     super(); 
     this.manager = manager; 
     this.channel = channel; 
     this.activity = activity; 
     // this.context= context; 
    } 

    @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 
      int state = intent.getIntExtra(WifiP2pManager.EXTRA_WIFI_STATE, -1); 
      if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) { 

       //Toast.makeText(context, "Wi-Fi Direct is enable", Toast.LENGTH_LONG).show(); 

      } else { 

       //Toast.makeText(context, "Wi-Fi Direct is not enable", Toast.LENGTH_LONG).show(); 
      }  

     } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
      // Call WifiP2pManager.requestPeers() to get a list of current peers 

      // 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 (manager != null) { 
       manager.requestPeers(channel, myPeerListListener); 
       manager.onPeersAvailable(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 
     } 
    } 
} 

Cho đến nay mã của tôi sẽ có thể phát hiện các đồng nghiệp xung quanh thiết bị đang chạy ứng dụng, ID nào sẽ được lưu trữ trong biến myPeerListListener. Tất cả điều này diễn ra theo ý định thứ hai của phương pháp BroadcastReceiver được gọi là OnReceiv(), bằng cách gọi:

manager.requestPeers(channel, myPeerListListener); 

Bây giờ tôi muốn thao tác danh sách đó. Vì vậy, sau khi thông tin API nó nên được gọi requestPeers, bạn sẽ nhìn thấy API trên đây:

http://developer.android.com/guide/topics/connectivity/wifip2p.html

* Mục Discovering Peers

Vì vậy, những gì tôi đã cố gắng là để viết dưới đây một cuộc gọi đến :

manager.onPeersAvailable(myPeerListListener); 

nhưng tôi nhận được lỗi này:

Phương thức onPeersAvailable (WifiP2pManager.PeerListListener) không được xác định cho loại WifiP2pManager

Có thể cho tôi biết làm cách nào để gửi PeerListListener đến hoạt động chính đúng không?

Cảm ơn bạn rất nhiều vì đã dành thời gian của bạn

Trả lời

12

dtheo đã trả lời và trỏ tới hướng dẫn Android tuyệt vời về chủ đề này. Tôi sẽ chỉ thực hiện các thay đổi trên mã OP để hiển thị cách đạt được các chức năng được yêu cầu.

Theo hướng dẫn Android chính thức here, các api khám phá wifip2p nên được sử dụng theo cách này:

Trong lớp MainActivity của bạn:

mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { 
    public void onSuccess() { 
     TextDebug.setText("Ha habido éxito buscando Peers"); 
    } 

    public void onFailure(int reasonCode) { 
     TextDebug.setText("Algo ha salido mal buscando Peers"); 
    } 
}); 

// ############# DELETE THE FOLLOWING LINE ############# 
onPeersAvailable(myPeerListListener); // <<<<<<< DELETE THIS LINE 

Và trong lớp BroadcastReceiver của bạn, làm như sau thay vào đó:

@Override 
public void onReceive(Context context, Intent intent) { 
    ...  
    if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { 
     ... 
    } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { 
     if (manager != null) { 
      manager.requestPeers(channel, new WifiP2pManager.PeerListListener() { 
      @Override 
      public void onPeersAvailable(WifiP2pDeviceList peers) { 
       Log.d(TAG,String.format("PeerListListener: %d peers available, updating device list", peers.getDeviceList().size())); 

       // DO WHATEVER YOU WANT HERE 
       // YOU CAN GET ACCESS TO ALL THE DEVICES YOU FOUND FROM peers OBJECT 

      } 
     }); 
     } 
    } 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 
    } 
} 
+0

Thx Zhang. Đã tiết kiệm thời gian cho tôi. Chúc mừng. – greenspand

7

dtheo đã trả lời câu hỏi.

Tôi chỉ muốn thêm một lưu ý nhỏ: Đối với Wi-Fi Direct, cả hai thiết bị cần phải được quét đồng thời để khám phá lẫn nhau. Ngoài ra còn có thời gian chờ quét có nghĩa là khả năng phát hiện có thể bị mất sau một thời gian.

Các vấn đề liên quan