Я стараюсь, чтобы получить MAC-адрес с 2 способами, первый по интерфейсу, и если его не удалось, я получить его файловой системы, но вам нужно включить Wi-Fi для доступа к файлу.
//Android 6.0 : Access to mac address from WifiManager forbidden
private static final String marshmallowMacAddress = "02:00:00:00:00:00";
private static final String fileAddressMac = "/sys/class/net/wlan0/address";
public static String recupAdresseMAC(WifiManager wifiMan) {
WifiInfo wifiInf = wifiMan.getConnectionInfo();
if(wifiInf.getMacAddress().equals(marshmallowMacAddress)){
String ret = null;
try {
ret= getAdressMacByInterface();
if (ret != null){
return ret;
} else {
ret = getAddressMacByFile(wifiMan);
return ret;
}
} catch (IOException e) {
Log.e("MobileAccess", "Erreur lecture propriete Adresse MAC");
} catch (Exception e) {
Log.e("MobileAcces", "Erreur lecture propriete Adresse MAC ");
}
} else{
return wifiInf.getMacAddress();
}
return marshmallowMacAddress;
}
private static String getAdressMacByInterface(){
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (nif.getName().equalsIgnoreCase("wlan0")) {
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 e) {
Log.e("MobileAcces", "Erreur lecture propriete Adresse MAC ");
}
return null;
}
private static String getAddressMacByFile(WifiManager wifiMan) throws Exception {
String ret;
int wifiState = wifiMan.getWifiState();
wifiMan.setWifiEnabled(true);
File fl = new File(fileAddressMac);
FileInputStream fin = new FileInputStream(fl);
ret = convertStreamToString(fin);
fin.close();
boolean enabled = WifiManager.WIFI_STATE_ENABLED == wifiState;
wifiMan.setWifiEnabled(enabled);
return ret;
}
Добавьте эту строку в свой манифест.
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
Я рекомендую вам упорствовать свой адрес макинтоша в ваших предпочтениях, как здесь
mac = activity.getSharedPreferences("MAC_ADDRESS", Context.MODE_PRIVATE).getString("MAC_ADDRESS", "");
if(mac == null || mac.equals("")){
WifiManager wifiMan = (WifiManager) activity.getSystemService(Context.WIFI_SERVICE);
mac = MobileAccess.recupAdresseMAC(wifiMan);
if(mac != null && !mac.equals("")){
SharedPreferences.Editor editor = activity.getSharedPreferences("MAC_ADDRESS", Context.MODE_PRIVATE).edit();
editor.putString("MAC_ADDRESS", mac).commit();
}
}
ли вы убедились, что вы проверили на 'ACCESS_WIFI_STATE' до получения MAC-адрес? В M это не сработает, если вы только попросите об этом в манифесте, вы должны выполнить его в rumtime следующим образом: https://www.youtube.com/watch?v=C8lUdPVSzDk&index=3&list=PLWz5rJ2EKKc-lJo_RGGXL2Psr8vVCTWjM –
Спасибо за ответ. У меня есть это разрешение в моем манифесте, но когда я иду проверить его программно, как показано на видео, Android Studio не распознает «checkSelfPermission», я не знаю, может ли быть, потому что я нацелен на API 21 Lollipop и hasn Установлен API 23 Marshmallow. – Mazinger
Прежде чем вы позвоните в checkSelfPermission, вы должны проверить, не является ли версия SDK lass, чем API 23. Зефир, как здесь: http://stackoverflow.com/questions/3423754/retrieving-android-api-version-programmatically. –