Android 6.0 में मैक एड्रेस प्राप्त करना




wifi mac-address (6)

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

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {
        //handle exception
    }
    return "";
}

मैं एक ऐसा ऐप विकसित कर रहा हूं, जो डिवाइस का मैक एड्रेस प्राप्त करता है, लेकिन चूंकि एंड्रॉइड 6.0 पर मेरा कोड काम नहीं करता है, इसलिए मुझे एक गलत मान दिया गया है।

यहाँ मेरा कोड है ...

public String ObtenMAC()
{
    WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    WifiInfo info = manager.getConnectionInfo();

    return(info.getMacAddress().toUpperCase());
}

वास्तविक मैक पते के बजाय, यह एक अजीब कोड देता है: 02:00:00:00:00:00


आप IPv6 स्थानीय पते से मैक पता प्राप्त कर सकते हैं। जैसे, IPv6 पता "fe80 :: 1034: 56ff: fe78: 9abc" मैक पते से मेल खाता है "12-34-56-78-9a-bc"। नीचे दिए गए कोड को देखें। WiFi IPv6 एड्रेस प्राप्त करने के लिए केवल android.permission.INTERNET की आवश्यकता होती है।

विकिपीडिया पृष्ठ IPv6 पता देखें, विशेष रूप से "स्थानीय पते" fe80 :: / 64 और "संशोधित EUI-64" अनुभाग के बारे में नोट।

/**
 * Gets an EUI-48 MAC address from an IPv6 link-local address.
 * E.g., the IPv6 address "fe80::1034:56ff:fe78:9abc"
 * corresponds to the MAC address "12-34-56-78-9a-bc".
 * <p/>
 * See the note about "local addresses" fe80::/64 and the section about "Modified EUI-64" in
 * the Wikipedia article "IPv6 address" at https://en.wikipedia.org/wiki/IPv6_address
 *
 * @param ipv6 An Inet6Address object.
 * @return The EUI-48 MAC address as a byte array, null on error.
 */
private static byte[] getMacAddressFromIpv6(final Inet6Address ipv6)
{
    byte[] eui48mac = null;

    if (ipv6 != null) {
        /*
         * Make sure that this is an fe80::/64 link-local address.
         */
        final byte[] ipv6Bytes = ipv6.getAddress();
        if ((ipv6Bytes != null) &&
                (ipv6Bytes.length == 16) &&
                (ipv6Bytes[0] == (byte) 0xfe) &&
                (ipv6Bytes[1] == (byte) 0x80) &&
                (ipv6Bytes[11] == (byte) 0xff) &&
                (ipv6Bytes[12] == (byte) 0xfe)) {
            /*
             * Allocate a byte array for storing the EUI-48 MAC address, then fill it
             * from the appropriate bytes of the IPv6 address. Invert the 7th bit
             * of the first byte and discard the "ff:fe" portion of the modified
             * EUI-64 MAC address.
             */
            eui48mac = new byte[6];
            eui48mac[0] = (byte) (ipv6Bytes[8] ^ 0x2);
            eui48mac[1] = ipv6Bytes[9];
            eui48mac[2] = ipv6Bytes[10];
            eui48mac[3] = ipv6Bytes[13];
            eui48mac[4] = ipv6Bytes[14];
            eui48mac[5] = ipv6Bytes[15];
        }
    }

    return eui48mac;
}

कृपया Android 6.0 परिवर्तन देखें।

इस रिलीज़ से शुरू होने वाले उपयोगकर्ताओं को अधिक डेटा सुरक्षा प्रदान करने के लिए, एंड्रॉइड वाई-फाई और ब्लूटूथ एपीआई का उपयोग करने वाले ऐप्स के लिए डिवाइस के स्थानीय हार्डवेयर पहचानकर्ता के लिए प्रोग्रामेटिक एक्सेस को हटा देता है। WifiInfo.getMacAddress () और BluetoothAdapter.getAddress () विधियाँ अब 02: 00: 00: 00: 00: 00 का निरंतर मान लौटाती हैं।

ब्लूटूथ और वाई-फाई स्कैन के माध्यम से आस-पास के बाहरी उपकरणों के हार्डवेयर पहचानकर्ताओं तक पहुँचने के लिए, आपके ऐप में अब ACCESS_FINE_LOCATION या ACCESS_COARSE_LOCATION अनुमतियाँ होनी चाहिए।


मुझे काम करने के लिए उपरोक्त उत्तर नहीं मिला, लेकिन एक और जवाब पर ठोकर खाई।

यहाँ IPv6 एड्रेस पाने और फिर मैक एड्रेस प्राप्त करने की पूरी और सरल विधि दी गई है।

एंड्रॉइड मार्शमैलो में वाई-फाई मैक एड्रेस कैसे प्राप्त करें

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 तरीके का कोड है, बस इसे पिछले कॉपी करें और यह काम करेगा!

//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);
        StringBuilder builder = new StringBuilder();
    int ch;
    while((ch = fin.read()) != -1){
        builder.append((char)ch);
    }

    ret = builder.toString();
    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" />
  • सारांश: यह कोड इंटरफेस द्वारा पहले मैक एड्रेस प्राप्त करने की कोशिश करेगा और यदि यह विफल हो गया तो इसे फाइल सिस्टम द्वारा प्राप्त किया जाएगा।

  • नोट: फ़ाइल सिस्टम तरीके के लिए, आपको फ़ाइल को एक्सेस करने के लिए वाईफ़ाई को सक्षम करने की आवश्यकता है।

Thnx to Sam का जवाब यहाँ https://.com/a/39288868/3818437


सबसे पहले आपको इंटरनेट उपयोगकर्ता की अनुमति को जोड़ना होगा।

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

तब आप NetworkInterfaces API पर मैक पा सकते हैं।

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






mac-address