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.





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.


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 .


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

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


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

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

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>

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


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

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();


-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.)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.