Как получить программный код Mac Id устройства Android. Я сделал с кодом IMIE, и я знаю, как проверять MAC-идентификатор на устройстве вручную, но не знаю, как узнать программно.
Как найти MAC-адрес устройства Android программно
Ответ 1
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wInfo = wifiManager.getConnectionInfo();
String macAddress = wInfo.getMacAddress();
Кроме того, добавьте ниже разрешение в вашем файле манифеста
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Пожалуйста, обратитесь к Android 6.0 Изменения.
Чтобы обеспечить пользователям более надежную защиту данных, начиная с этого выпуска, Android удаляет программный доступ к локальному идентификатору оборудования устройств для приложений, использующих API-интерфейсы Wi-Fi и Bluetooth. Методы WifiInfo.getMacAddress() и BluetoothAdapter.getAddress() теперь возвращают постоянное значение 02: 00: 00: 00: 00: 00.
Чтобы получить доступ к идентификаторам оборудования соседних внешних устройств через сканирование Bluetooth и Wi-Fi, ваше приложение должно теперь иметь разрешения ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION.
Ответ 2
См. этот пост, где я представил пример Utils.java для реализации pure-java и работает без WifiManager. Некоторые устройства Android могут не иметь доступ к Wi-Fi или использовать проводку Ethernet.
Utils.getMACAddress("wlan0");
Utils.getMACAddress("eth0");
Utils.getIPAddress(true); // IPv4
Utils.getIPAddress(false); // IPv6
Ответ 3
С этим кодом вы также сможете получить MacAddress в Android 6.0 также
public static String getMacAddr() {
try {
List <NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif: all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b: macBytes) {
//res1.append(Integer.toHexString(b & 0xFF) + ":");
res1.append(String.format("%02X:", b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {}
return "02:00:00:00:00:00";
}
РЕДАКТИРОВАТЬ 1. Этот ответ получил ошибку, когда байт, который в шестнадцатеричной форме получил одну цифру, не будет отображаться с "0" перед ним. Приложение к res1 было изменено, чтобы позаботиться об этом.
Ответ 4
Работает
package com.keshav.fetchmacaddress;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e("keshav","getMacAddr -> " +getMacAddr());
}
public static String getMacAddr() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
// res1.append(Integer.toHexString(b & 0xFF) + ":");
res1.append(String.format("%02X:",b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
//handle exception
}
return "";
}
}
ОБНОВЛЕНИЕ 1
Этот ответ получил ошибку, когда байт, который в шестнадцатеричной форме получил одну цифру, не появится с "0" перед ним. Добавление к res1
было изменено, чтобы позаботиться об этом.
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
// res1.append(Integer.toHexString(b & 0xFF) + ":");
res1.append(String.format("%02X:",b));
}
Ответ 5
Вот котлинская версия ответа Арт Тилваса:
fun getMacAddr(): String {
try {
val all = Collections.list(NetworkInterface.getNetworkInterfaces())
for (nif in all) {
if (!nif.getName().equals("wlan0", ignoreCase=true)) continue
val macBytes = nif.getHardwareAddress() ?: return ""
val res1 = StringBuilder()
for (b in macBytes) {
//res1.append(Integer.toHexString(b & 0xFF) + ":");
res1.append(String.format("%02X:", b))
}
if (res1.length > 0) {
res1.deleteCharAt(res1.length - 1)
}
return res1.toString()
}
} catch (ex: Exception) {
}
return "02:00:00:00:00:00"
}
Ответ 6
Есть простой способ:
Android:
String macAddress =
android.provider.Settings.Secure.getString(this.getApplicationContext().getContentResolver(), "android_id");
Xamarin:
Settings.Secure.GetString(this.ContentResolver, "android_id");
Ответ 7
private fun getMac(): String? =
try {
NetworkInterface.getNetworkInterfaces()
.toList()
.find { networkInterface -> networkInterface.name.equals("wlan0", ignoreCase = true) }
?.hardwareAddress
?.joinToString(separator = ":") { byte -> "%02X".format(byte) }
} catch (ex: Exception) {
ex.printStackTrace()
null
}