Get Bluetooth local mac address in Marshmallow

前端 未结 8 478
半阙折子戏
半阙折子戏 2020-11-29 06:23

Pre Marshmallow my app would obtain it\'s device MAC address via BluetoothAdapter.getDefaultAdapter().getAddress().

Now with Marshmallow Android is retu

相关标签:
8条回答
  • 2020-11-29 06:51

    Please use the below code to get the bluetooth mac address. let me know if any issues.

    private String getBluetoothMacAddress() {
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        String bluetoothMacAddress = "";
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
            try {
                Field mServiceField = bluetoothAdapter.getClass().getDeclaredField("mService");
                mServiceField.setAccessible(true);
    
                Object btManagerService = mServiceField.get(bluetoothAdapter);
    
                if (btManagerService != null) {
                    bluetoothMacAddress = (String) btManagerService.getClass().getMethod("getAddress").invoke(btManagerService);
                }
            } catch (NoSuchFieldException e) {
    
            } catch (NoSuchMethodException e) {
    
            } catch (IllegalAccessException e) {
    
            } catch (InvocationTargetException e) {
    
            }
        } else {
            bluetoothMacAddress = bluetoothAdapter.getAddress();
        }
        return bluetoothMacAddress;
    }
    
    0 讨论(0)
  • 2020-11-29 06:52

    Getting the MAC address via reflection can look like this:

    private static String getBtAddressViaReflection() {
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        Object bluetoothManagerService = new Mirror().on(bluetoothAdapter).get().field("mService");
        if (bluetoothManagerService == null) {
            Log.w(TAG, "couldn't find bluetoothManagerService");
            return null;
        }
        Object address = new Mirror().on(bluetoothManagerService).invoke().method("getAddress").withoutArgs();
        if (address != null && address instanceof String) {
            Log.w(TAG, "using reflection to get the BT MAC address: " + address);
            return (String) address;
        } else {
            return null;
        }
    }
    

    using a reflection library (net.vidageek:mirror) but you'll get the idea.

    0 讨论(0)
  • 2020-11-29 06:53

    Access to the mac address has been deliberately removed:

    To provide users with greater data protection, starting in this release, Android removes programmatic access to the device’s local hardware identifier for apps using the Wi-Fi and Bluetooth APIs.

    (from Android 6.0 Changes)

    0 讨论(0)
  • 2020-11-29 06:57

    Worked great

     private String getBluetoothMacAddress() {
            BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            String bluetoothMacAddress = "";
            try {
                Field mServiceField = bluetoothAdapter.getClass().getDeclaredField("mService");
                mServiceField.setAccessible(true);
    
                Object btManagerService = mServiceField.get(bluetoothAdapter);
    
                if (btManagerService != null) {
                    bluetoothMacAddress = (String) btManagerService.getClass().getMethod("getAddress").invoke(btManagerService);
                }
            } catch (NoSuchFieldException | NoSuchMethodException | IllegalAccessException | InvocationTargetException ignore) {
    
            }
            return bluetoothMacAddress;
        }
    
    0 讨论(0)
  • 2020-11-29 07:06

    You can access Mac address from the file "/sys/class/net/" + networkInterfaceName+ "/address" ,where networkInterfaceName can be wlan0 or eth1.But Its permission may be read-protected,so it may not work in some devices. I am also attaching the code part which i got from SO.

    public static String getWifiMacAddress() {
            try {
                String interfaceName = "wlan0";
                List<NetworkInterface> interfaces = Collections
                        .list(NetworkInterface.getNetworkInterfaces());
                for (NetworkInterface intf : interfaces) {
                    if (!intf.getName().equalsIgnoreCase(interfaceName)) {
                        continue;
                    }
    
                    byte[] mac = intf.getHardwareAddress();
                    if (mac == null) {
                        return "";
                    }
    
                    StringBuilder buf = new StringBuilder();
                    for (byte aMac : mac) {
                        buf.append(String.format("%02X:", aMac));
                    }
                    if (buf.length() > 0) {
                        buf.deleteCharAt(buf.length() - 1);
                    }
                    return buf.toString();
                }
            } catch (Exception exp) {
    
                exp.printStackTrace();
            } 
            return "";
        }
    
    0 讨论(0)
  • 2020-11-29 07:07

    zmarties is right but you can still get the mac address via reflection or Settings.Secure:

      String macAddress = android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
    
    0 讨论(0)
提交回复
热议问题