Программно получать MAC-адрес устройства Android

Мне нужно получить MAC-адрес моего устройства Android с помощью Java. Я искал в Интернете, но я не нашел ничего полезного.

Как уже указывалось в комментарии, MAC-адрес может быть получен через WifiManager .

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo info = manager.getConnectionInfo(); String address = info.getMacAddress(); 

Также не забудьте добавить соответствующие разрешения в ваш AndroidManifest.xml

  

См. Изменения 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.

Получение MAC-адреса через WifiInfo.getMacAddress() не будет работать на Marshmallow и выше, оно отключено и вернет постоянное значение 02:00:00:00:00:00 .

  public String getMacAddress(Context context) { WifiManager wimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); String macAddress = wimanager.getConnectionInfo().getMacAddress(); if (macAddress == null) { macAddress = "Device don't have mac address or wi-fi is disabled"; } return macAddress; } 

здесь есть другие способы

 public static String getMacAddr() { try { List 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(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"; } 

Его работа с зефиром

 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 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) + ":"); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { //handle exception } return ""; } } 

Вы можете получить адрес mac:

 WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); WifiInfo wInfo = wifiManager.getConnectionInfo(); String mac = wInfo.getMacAddress(); 

Установить разрешение в Menifest.xml

  

Вы больше не можете получить MAC-адрес устройства устройства Android. Методы WifiInfo.getMacAddress () и BluetoothAdapter.getAddress () возвращаются 02: 00: 00: 00: 00: 00. Это ограничение было введено в Android 6.0.

Но Роб Андерсон нашел решение, которое работает для https://stackoverflow.com/a/35830358

Я сам тестировал этот код, и он предоставит вам MAC-адрес WiFi или Ethernet, ansible всем.

  public static String getMacAddr() { try { List 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) + ":"); } StringBuilder sb = new StringBuilder(); for (int i = 0; i < macBytes.length; i++) { sb.append(String.format("%02X%s", macBytes[i], (i < macBytes.length - 1) ? "-" : "")); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { //handle exception } return getMacAddress(); } public static String loadFileAsString(String filePath) throws java.io.IOException{ StringBuffer data = new StringBuffer(1000); BufferedReader reader = new BufferedReader(new FileReader(filePath)); char[] buf = new char[1024]; int numRead=0; while((numRead=reader.read(buf)) != -1){ String readData = String.valueOf(buf, 0, numRead); data.append(readData); } reader.close(); return data.toString(); } public static String getMacAddress(){ try { return loadFileAsString("/sys/class/net/eth0/address") .toUpperCase().substring(0, 17); } catch (IOException e) { e.printStackTrace(); return "02:00:00:00:00:00"; } } 

Я основал это решение из http://robinhenniges.com/en/android6-get-mac-address-programmatically, и он работает для меня! Надежда помогает!

 public static String getMacAddr() { try { List 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) { String hex = Integer.toHexString(b & 0xFF); if (hex.length() == 1) hex = "0".concat(hex); res1.append(hex.concat(":")); } if (res1.length() > 0) { res1.deleteCharAt(res1.length() - 1); } return res1.toString(); } } catch (Exception ex) { } return ""; } 

Здесь взяты из Android-источников. Это фактический код, который показывает ваш MAC ADDRESS в приложении настроек системы.

 private void refreshWifiInfo() { WifiInfo wifiInfo = mWifiManager.getConnectionInfo(); Preference wifiMacAddressPref = findPreference(KEY_MAC_ADDRESS); String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress(); wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress : getActivity().getString(R.string.status_unavailable)); Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS); String ipAddress = Utils.getWifiIpAddresses(getActivity()); wifiIpAddressPref.setSummary(ipAddress == null ? getActivity().getString(R.string.status_unavailable) : ipAddress); } 

Я думаю, что я просто нашел способ читать MAC-адреса без разрешения LOCATION: Запустите ip addr и проанализируйте его вывод. (вы, вероятно, могли бы сделать подобное, посмотрев исходный код этого двоичного кода)

  • Как правильно использовать обратную совместимость вектора вектора с последней поддержкой Android?
  • Изменить фон списка ListView - странное поведение
  • Android Вызов метода из другого classа
  • Java-коллекция пар ценностей? (кортежи?)
  • Можно ли читать данные Firebase без подключения слушателей?
  • округлить до 2 десятичных знаков в java?
  • org.openqa.selenium.WebDriverException: неизвестная ошибка: результат функции вызова отсутствует «значение»
  • Android - запуск службы при загрузке
  • Почему не конечная «локальная» переменная не может использоваться внутри внутреннего classа, и вместо этого может использоваться не конечное поле охватывающего classа?
  • Неудачное обнаружение службы с использованием Bluetooth на Android
  • Активность Android ClassNotFoundException - все
  • Давайте будем гением компьютера.