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




mac-address (9)

मैं मैक एड्रेस को 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);
        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();
                    }
                }

मैं एक ऐप विकसित कर रहा हूं, जो डिवाइस का मैक एड्रेस प्राप्त करता है, लेकिन चूंकि एंड्रॉइड 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"।

किसी को भी इसे हल करने के लिए मेरी मदद कर सकते हैं ?.


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

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

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


उत्तर ज्यादातर सही हैं, लेकिन ध्यान रखें, कि एंड्रॉइड 7 में एक बदलाव है। आपको इसका उपयोग करने की आवश्यकता होगी

DevicePolicyManager और विधि getWifiMacAddress । आधिकारिक डॉक्स में एक टाइपो होता है, जिसका अर्थ है कि आप इसे वहां से कॉपी / पेस्ट करें।

DevicePolicyManager.getWifiMacAddress()

Refs: https://developer.android.com/about/versions/nougat/android-7.0-changes.html

Android Nougat और O प्रोग्राम में डिवाइस मैक एड्रेस प्राप्त करें


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

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

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

यहाँ 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";
}

यह पहले से ही परीक्षण किया है और यह काम करता है। रोब एंडरसन को बहुत धन्यवाद!


इसकी पूरी तरह से ठीक है

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

आप 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 में मैक पता प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग करें

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

मेरी समस्या यह थी कि मुझे केवल आवेदन जीवनकाल के दौरान दृढ़ता की आवश्यकता होती है (यानी एक ही निष्पादन जिसमें एक ही ऐप के भीतर अन्य उप-गतिविधियां शुरू करना और डिवाइस को घूर्णन करना आदि शामिल हैं)। मैंने उपर्युक्त उत्तरों के विभिन्न संयोजनों की कोशिश की लेकिन मुझे सभी परिस्थितियों में जो चाहिए था वह नहीं मिला। अंत में मेरे लिए क्या काम किया गया था सहेजने के दौरान सहेजे गए इंस्टेंसस्टेट का संदर्भ प्राप्त करना:

mySavedInstanceState=savedInstanceState;

और जब मैं इसकी आवश्यकता होती है, तो मेरी चर की सामग्री प्राप्त करने के लिए इसका उपयोग करें:

if (mySavedInstanceState !=null) {
   boolean myVariable = mySavedInstanceState.getBoolean("MyVariable");
}

मैं उपरोक्त सुझाव देता हूं onSaveInstanceStateऔर onRestoreInstanceStateसुझाव देता हूं लेकिन मुझे लगता है कि जब मैं बदलता हूं तो वैरिएबल को सहेजने के लिए मैं अपनी विधि का वैकल्पिक रूप से उपयोग कर सकता हूं (उदाहरण के लिए putBoolean)





android wifi mac-address