2012-05-18 68 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

不错的,谢谢! –