2012-05-18 105 views
3

我正在嘗試檢索Android設備的MAC地址。如果WiFi處於打開狀態,這通常可以通過WiFiManager API訪問。如何檢索WiFi Direct MAC地址?

如果WiFi關閉並且WiFi Direct處於打開狀態,有什麼方法可以獲取MAC地址? WiFi和WiFi Direct無法在我的手機上同時開啓。

謝謝

回答

2

WiFi的MAC地址不同於WiFi Direct的MAC地址。通常前兩個字母可能不同。小心一點。

0

WiFi Direct mac地址將會有所不同。這是由@auselen在這裏精美地解釋https://stackoverflow.com/a/14480530/3167704

我剛想出一個方法來檢索WiFi Direct的mac地址。這並不漂亮,但完成了工作。這裏的代碼,

final WifiP2pManager p2pManager = (WifiP2pManager) getSystemService(WIFI_P2P_SERVICE); 
    final WifiP2pManager.Channel channel = p2pManager.initialize(this, getMainLooper(), null); 

    p2pManager.createGroup(channel, new WifiP2pManager.ActionListener() { 
     @Override 
     public void onSuccess() { 
      p2pManager.requestGroupInfo(channel, new WifiP2pManager.GroupInfoListener() { 
       @Override 
       public void onGroupInfoAvailable(WifiP2pGroup wifiP2pGroup) { 
        Log.i("", wifiP2pGroup.getOwner().deviceAddress); 

        // Following removal necessary to not have the manager busy for other stuff, subsequently 
        p2pManager.removeGroup(channel, new WifiP2pManager.ActionListener() { 
         @Override 
         public void onSuccess() { 
          Log.i("", "Removed"); 
         } 

         @Override 
         public void onFailure(int i) { 
          Log.i("", "Failed " + i); 
         } 
        }); 
       } 
      }); 
     } 

     @Override 
     public void onFailure(int i) { 
      Log.i("", String.valueOf(i)); 
     } 
    }); 
+4

拿去......這實在太醜陋... *嘆*。必須有另一種方式... –

7

我一直在尋找這個在我的項目。我的要求是唯一標識由WiFi Direct組成的特別P2p網絡中的設備。每個設備在下一次接近時都應該標識其好友設備。我需要我自己的WiFi(Direct)MAC和我的朋友們爲這個朋友區創建創建一個密鑰。

我的研究:設計是這樣的,有一個唯一的通用ID和本地ID。 原因:通用ID只能用於連接到基礎架構模式網絡。本地ID可用於「ad-hoc」模式網絡(設備到設備)。在這種特設模式下,單個設備可能同時屬於幾個特設組。

  1. 因此,爲了支持這種併發操作,P2p設備支持 多個MAC實體,可能在不同的信道上。
  2. 對於每個會話,持續組可能會爲每個會話使用不同的信道和設備 MAC。
  3. P2P設備在發現和協商期間使用其全局MAC地址作爲設備ID,併爲組內的所有幀使用臨時本地MAC地址。 Understood from here

但是,沒有直接的方法來獲得自己的WiFi P2p MAC地址。 Issue 53437: Android

在這一問題的討論,從谷歌的項目成員曾建議這是可能的,只是它沒有被記錄在案

解決方案:使用意圖過濾WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION和意圖WifiP2pManager.EXTRA_WIFI_P2P_DEVICE額外

這是我如何在我的項目中使用它:

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

if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION 
      .equals(action)) { 

     WifiP2pDevice device = (WifiP2pDevice) intent 
       .getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE); 

     String myMac = device.deviceAddress; 

     Log.d(TAG, "Device WiFi P2p MAC Address: " + myMac); 

/* Saving WiFi P2p MAC in SharedPref */ 

     sharedPref = context.getSharedPreferences(context.getString(R.string.sp_file_name), Context.MODE_PRIVATE); 
     String MY_MAC_ADDRESS = sharedPref.getString(context.getString(R.string.sp_field_my_mac), null); 

     if (MY_MAC_ADDRESS == null || MY_MAC_ADDRESS != myMac) { 
      SharedPreferences.Editor editor = sharedPref.edit(); 
      editor.putString(context.getString(R.string.sp_field_my_mac), myMac); 
      editor.commit(); 
     } 

希望這可以幫助別人!

2

WiFi的MAC地址與WiFi Direct的MAC地址不同。

可以使用下面的代碼獲得直接WiFi地址:

public String getWFDMacAddress(){ 
    try { 
     List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); 
     for (NetworkInterface ntwInterface : interfaces) { 

      if (ntwInterface.getName().equalsIgnoreCase("p2p0")) { 
       byte[] byteMac = ntwInterface.getHardwareAddress(); 
       if (byteMac==null){ 
        return null; 
       } 
       StringBuilder strBuilder = new StringBuilder(); 
       for (int i=0; i<byteMac.length; i++) { 
        strBuilder.append(String.format("%02X:", byteMac[i])); 
       } 

       if (strBuilder.length()>0){ 
        strBuilder.deleteCharAt(strBuilder.length()-1); 
       } 

       return strBuilder.toString(); 
      } 

     } 
    } catch (Exception e) { 
     Log.d(TAG, e.getMessage()); 
    } 
    return null; 
} 
+0

不錯的,謝謝! –