Programmgesteuertes Abrufen des MAC eines Android-Geräts

90

Ich muss die MAC-Adresse meines Android-Geräts mit Java ermitteln. Ich habe online gesucht, aber nichts Nützliches gefunden.

TSW1985
quelle
Bitte überprüfen Sie diese Lösung, es funktioniert für mich stackoverflow.com/questions/31329733/…
Gorio
Von Android M ist diese API veraltet, verwenden Sie diese für jetzt: stackoverflow.com/questions/31329733/…
Ehud

Antworten:

112

Wie bereits im Kommentar erwähnt, kann die MAC-Adresse über den WifiManager empfangen werden .

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

Vergessen Sie auch nicht, die entsprechenden Berechtigungen zu Ihrem hinzuzufügen AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

Weitere Informationen finden Sie unter Änderungen in Android 6.0 .

Um den Benutzern einen besseren Datenschutz zu bieten, entfernt Android ab dieser Version den programmgesteuerten Zugriff auf die lokale Hardware-ID des Geräts für Apps, die die Wi-Fi- und Bluetooth-APIs verwenden. Die Methoden WifiInfo.getMacAddress () und BluetoothAdapter.getAddress () geben jetzt einen konstanten Wert von 02: 00: 00: 00: 00: 00 zurück.

Um über Bluetooth- und Wi-Fi-Scans auf die Hardware-IDs externer Geräte in der Nähe zugreifen zu können, muss Ihre App jetzt über die Berechtigungen ACCESS_FINE_LOCATION oder ACCESS_COARSE_LOCATION verfügen.

Konrad Reiche
quelle
11
Auch nur eine Anmerkung, manchmal kann die Mac-Adresse nicht
abgerufen
3
In dem verlinkten Blog wird auch erklärt, wie Sie diese MAC-Adresse allgemeiner finden, ohne dass die Netzwerkschnittstelle eine WiFi-Verbindung verwendet.
Stephen C
Denken Sie daran, den Kontext zu verwenden, um den getSystemService aufzurufen.
Tito Leiva
Dies ist ideal für Android-Telefone und -Tablets, die Wifi verwenden, aber ich versuche, die Ethernet-MAC-Adresse auf einem alten Gingerbread-Android-Tablet abzurufen, das entweder Wifi oder Ethernet verwenden kann. Haben Sie Gedanken darüber, wie Sie die Ethernet-MAC-Adresse überprüfen können? Vielen Dank.
Seth
@sbrichards was meinst du mit ausgeschaltetem WiFi?
Peterchaula
33

Erhalten der MAC-Adresse durch WifiInfo.getMacAddress() funktioniert unter Marshmallow und höher nicht. Sie wurde deaktiviert und gibt den konstanten Wert von zurück02:00:00:00:00:00 .

Minipif
quelle
3
Was ist die Alternative?
Sam
2
@SameerThigale Hängt davon ab, was Sie erreichen möchten. Die Idee dahinter ist, dass Sie wahrscheinlich nicht versuchen sollten, die MAC-Adresse zu erhalten.
Minipif
Ich bin mir nicht sicher warum, aber ich kann keine veraltete Notiz im verknüpften API-Dokument finden. Vielleicht haben sie es sich anders überlegt?
DBX12
1
@ DBX12 Die Methode selbst wird nicht als veraltet markiert, obwohl sie nicht dokumentiert ist. Der zweite Link verweist auf einen offiziellen Hinweis dazu.
Minipif
24
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(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";
}
pm dubey
quelle
2
Es zeigt mir immer wieder "02: 00: 00: 00: 00: 00" auf Android 7.1.
Android-Entwickler
Es muss auf einem physischen Gerät und nicht auf einem Emulator oder einem virtuellen Gerät getestet werden
pm dubey
Funktioniert dieser Workaround-Ansatz noch? oder wurde es auf der Betriebssystemseite gepatcht / repariert?
CasualT
1
Es funktioniert immer noch. Vergessen Sie nicht, die Internet-Berechtigung in der Manifest-Datei zu erteilen.
Uhr Dubey
1
Es funktioniert nicht mehr mit Android Marshmallow und höher, da der Wert "02: 00: 00: 00: 00: 00"
SweArmy
11
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

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;
}

habe andere weg hier

ademar111190
quelle
Wird es macAddressjemals sein null?
Max Heiber
Welcher Parameter muss beim Funktionsaufruf als Kontext übergeben werden?
Donal
@Donal meinst du das Context context? Wenn ja, sollte ein Kontext funktionieren. developer.android.com/reference/android/content/…
ademar111190
11

Ich habe diese Lösung von http://robinhenniges.com/de/android6-get-mac-address-programmatisch gegründet und sie funktioniert für mich! Hoffnung hilft!

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) {
                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 "";
}
Tiziano Bruschetta
quelle
Ich nehme an, es liegt daran, dass wir das letzte ":" Zeichen entfernen müssen. Dieser Code ist 2 Jahre alt und wahrscheinlich nicht der beste Weg, dies zu tun. Sie sollten ihn optimieren
Tiziano Bruschetta
7

Es arbeitet mit Marshmallow

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) + ":");
                }

                if (res1.length() > 0) {
                    res1.deleteCharAt(res1.length() - 1);
                }
                return res1.toString();
            }
        } catch (Exception ex) {
            //handle exception
        }
        return "";
    }
}
Keshav Gera
quelle
Vielen Dank Qadir Hussain
Keshav Gera
3

Sie können Mac-Adresse erhalten:

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

Legen Sie die Berechtigung in Menifest.xml fest

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
Manoj Tarkar
quelle
Frage ist über Mac von Android-Gerät zu bekommen, nicht von WLAN-Router.
hina abbasi
3

Sie können die Hardware-MAC-Adresse eines Android-Geräts nicht mehr abrufen. Die Methoden WifiInfo.getMacAddress () und BluetoothAdapter.getAddress () geben 02: 00: 00: 00: 00: 00 zurück. Diese Einschränkung wurde in Android 6.0 eingeführt.

Rob Anderson hat jedoch eine Lösung gefunden, die für <Marshmallow: https://stackoverflow.com/a/35830358 funktioniert

Luvnish Monga
quelle
2

Entnommen aus den Android-Quellen hier . Dies ist der tatsächliche Code, der Ihre MAC-ADRESSE in der App für die Systemeinstellungen anzeigt.

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);
}
fernandohur
quelle
Wie soll ich in einer Nicht-Aktivitätsklasse oder einem Fragment darauf zugreifen?
Hunt
Sie benötigen einen Kontext, um ein WifiManager(dh WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);) zu erhalten.
fernandohur
5
Wenn es diesen Code versucht, erhalte ich die 02:00:00:00:00:00Mac-Adresse, nicht die tatsächliche WLAN-Mac-ID
Hunt
2

Mit dieser einfachen Methode

WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
            String WLANMAC = wm.getConnectionInfo().getMacAddress();
Abdulhakim Zeinu
quelle
-3

Ich glaube, ich habe gerade einen Weg gefunden, MAC-Adressen ohne LOCATION-Berechtigung zu lesen: Führen Sie ip linkdie Ausgabe aus und analysieren Sie sie. (Sie könnten wahrscheinlich das Gleiche tun, indem Sie sich den Quellcode dieser Binärdatei ansehen.)

Mein Gott
quelle