How do you retrieve the WiFi Direct MAC address?

前端 未结 4 507
猫巷女王i
猫巷女王i 2021-01-14 10:12

I am trying to retrieve the MAC address of an Android device. This is ordinarily possible through the WiFiManager API if WiFi is on.

Is there any way to get the MAC

4条回答
  •  离开以前
    2021-01-14 10:44

    I had been searching for this during my project. My requirements were to uniquely identify devices in an adhoc P2p network formed with WiFi Direct. Each device should identify its friend device the next time when it comes into proximity. I needed my own WiFi (Direct) MAC and my friends' to create a Key for this friend zone creation.

    My Research: The design is in such a way that there is an Unique Universal ID and a Local ID. Reason: Universal ID can only be used to connect to Infrastructure mode Networks. Local ID could be used for "ad-hoc" mode networks(device to device). In this ad-hoc mode, there are possibilities that a single device might simultaneosly belong to several ad-hoc groups.

    1. Hence to support this concurrent operations, P2p devices support Multiple MAC entities, possibly on different channels.
    2. For each session, a persistent group MAY use a different channel and device MAC for each session.
    3. P2P devices use their global MAC address as Device ID during discovery and negotiation, and a temporary local MAC address for all frames within a group. Understood from here

    However, there is NO straight forward way to obtain one's own WiFi P2p MAC address. Issue 53437: Android.

    In this issue discussion, the project member from google has suggested this is possible and just that it hasn't been documented

    Solution: Using intent filter WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION and the extra from the intent WifiP2pManager.EXTRA_WIFI_P2P_DEVICE

    This is how I have used it in my project:

    @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();
            }
    

    Hope this helps someone!

提交回复
热议问题