Pre Marshmallow私のアプリはBluetoothAdapter.getDefaultAdapter().getAddress().
経由でデバイスのMACアドレスを取得します
現在、MarshmallowでAndroidは02:00:00:00:00:00
を返しています。
追加のアクセス許可を追加する必要があるというリンクがあります(今のところわかりません)
<uses-permission Android:name="Android.permission.LOCAL_MAC_ADDRESS"/>
それを得ることができるように。しかし、それは私のために働いていません。
MACアドレスを取得するために必要な追加の許可はありますか?
ここで適切かどうかはわかりませんが、マニフェストには
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
ローカルのBluetooth MACアドレスを取得する方法はありますか?
結局のところ、私はAndroidからMACアドレスを取得できなくなりました。 Bluetoothデバイスは、AndroidデバイスMACアドレスを提供することになりました。これは保存され、必要に応じて使用されます。開発されており、これが状況に対処するための最良の方法であることが判明しました。
zmartiesは正しいですが、リフレクションまたはSettings.Secureを介してMACアドレスを取得できます。
String macAddress = Android.provider.Settings.Secure.getString(context.getContentResolver(), "bluetooth_address");
MACアドレスへのアクセスは意図的に削除されました。
このリリース以降、ユーザーにデータ保護を強化するために、Androidは、Wi-FiおよびBluetooth APIを使用するアプリのデバイスのローカルハードウェア識別子へのプログラムによるアクセスを削除します。
(from Android 6.0 Changes )
最初に、マニフェストに次のアクセス許可を追加する必要があります。
<uses-permission Android:name="Android.permission.BLUETOOTH" />
<uses-permission Android:name="Android.permission.BLUETOOTH_ADMIN" />
<uses-permission Android:name="Android.permission.LOCAL_MAC_ADDRESS" />
その後、
public static final String SECURE_SETTINGS_BLUETOOTH_ADDRESS = "bluetooth_address";
String macAddress = Settings.Secure.getString(getContentResolver(), SECURE_SETTINGS_BLUETOOTH_ADDRESS);
その後、アプリケーションはOEM /システムキーで署名する必要があります。 Android 8.1.0。
ファイルからMacアドレスにアクセスできます"/ sys/class/net /" +networkInterfaceName+ "/ address"、 networkInterfaceNameにはwlan0またはeth1を指定できますが、そのアクセス許可は読み取り保護されている可能性があるため、一部のデバイスでは機能しない可能性があります。 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 "";
}
リフレクションを介してMACアドレスを取得すると、次のようになります。
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;
}
}
リフレクションライブラリ(net.vidageek:mirror)を使用しますが、アイデアは得られます。
以下のコードを使用して、Bluetooth MACアドレスを取得してください。問題があれば教えてください。
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;
}
うまくいきました
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;
}