প্রোগ্রামিয়ালি কোনও অ্যান্ড্রয়েড ডিভাইসের ম্যাক পাচ্ছেন


94

আমার জাভা ব্যবহার করে আমার অ্যান্ড্রয়েড ডিভাইসের ম্যাক ঠিকানা নেওয়া দরকার। আমি অনলাইনে অনুসন্ধান করেছি, তবে দরকারী কিছু পাই নি।





দয়া করে এই সমাধানটি পরীক্ষা করে দেখুন, এটি আমার জন্য কাজ করে stackoverflow.com/questions/31329733/…
গরিও

অ্যান্ড্রয়েড এম থেকে এই এপিআই হ্রাস করা হয়েছে, এখনই এটি ব্যবহার করুন: স্ট্যাকওভারফ্লো.com
এহুদ

উত্তর:


116

ইতিমধ্যে মন্তব্যে ইঙ্গিত করা হয়েছে, ম্যাক ঠিকানা ওয়াইফাই ম্যানেজারের মাধ্যমে প্রাপ্ত হতে পারে ।

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

আপনার মধ্যে উপযুক্ত অনুমতি যুক্ত করতে ভুলবেন না AndroidManifest.xml

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

পড়ুন দয়া করে কে Android 6.0 পরিবর্তনসমূহ

ব্যবহারকারীদের বৃহত্তর ডেটা সুরক্ষা সরবরাহ করতে, এই রিলিজের শুরু করে অ্যান্ড্রয়েড ওয়াই-ফাই এবং ব্লুটুথ এপিআই ব্যবহার করে অ্যাপ্লিকেশনগুলির জন্য ডিভাইসের স্থানীয় হার্ডওয়্যার সনাক্তকারীটিতে প্রোগ্রামেটিক অ্যাক্সেস সরিয়ে দেয়। WifiInfo.getMacAddress () এবং BluetoothAdapter.getAddress () পদ্ধতিগুলি এখন 02: 00: 00: 00: 00: 00 এর ধ্রুবক মান প্রদান করে।

ব্লুটুথ এবং ওয়াই-ফাই স্ক্যানগুলির মাধ্যমে নিকটস্থ বাহ্যিক ডিভাইসের হার্ডওয়্যার শনাক্তকারীদের অ্যাক্সেস করতে আপনার অ্যাপ্লিকেশনটিতে এখন ACCESS_FINE_LOCATION বা ACCESS_COARSE_LOCATION অনুমতি থাকতে হবে।


11
এছাড়াও কেবল একটি নোট, কখনও কখনও ম্যাক ঠিকানাটি টানা যায় না কারণ ওয়াইফাইটি ডিভাইসে বন্ধ থাকে
sbrichards

4
লিঙ্কযুক্ত ব্লগ আরও ব্যাখ্যা করে যে কীভাবে এই MAC ঠিকানাটিকে আরও সাধারণ উপায়ে পাওয়া যায় যা নেটওয়ার্ক ইন্টারফেসটি ওয়াইফাই সংযোগ ব্যবহার করে তা ধরে নেয় না।
স্টিফেন সি

GetSystemService কল করতে প্রসঙ্গটি ব্যবহার করুন মনে রাখবেন।
টিটো লেভা

এটি ওয়াইফাই ব্যবহার করে অ্যান্ড্রয়েড ফোন এবং ট্যাবলেটগুলির জন্য দুর্দান্ত, তবে আমি কোনও পুরানো জিঞ্জারব্রেড অ্যান্ড্রয়েড ট্যাবলেটে ইথারনেট ম্যাক ঠিকানা পাওয়ার চেষ্টা করছি যা ওয়াইফাই বা ইথারনেট ব্যবহার করতে পারে। ইথারনেট ম্যাকের ঠিকানাটি কীভাবে পরীক্ষা করবেন তা সম্পর্কে কোনও চিন্তাভাবনা? ধন্যবাদ
শেঠ

@ এসব্রিচার্ডস ওয়াইফাই বন্ধ থাকার অর্থ কী?
পিটারচাউলা

36

এর মাধ্যমে ম্যাকের ঠিকানা WifiInfo.getMacAddress()পাওয়া মার্শমেলো এবং তারপরের উপর কাজ করবে না, এটি অক্ষম করা হয়েছে এবং এর ধ্রুবক মানটি02:00:00:00:00:00 ফিরিয়ে দেবে


4
বিকল্প কি?
সাম

4
@ সমীরথিগাল আপনি যা অর্জন করতে চাইছেন তা নির্ভর করে। এর পিছনে ধারণাটি হ'ল আপনার সম্ভবত ম্যাকের ঠিকানাটি পাওয়ার চেষ্টা করা উচিত নয়।
minipif

আমি নিশ্চিত না কেন, তবে আমি লিঙ্কযুক্ত এপিআই ডকটিতে অবহেলিত নোটটি খুঁজে পাচ্ছি না। তারা কি এই সম্পর্কে তাদের মন পরিবর্তন?
DBX12

4
@ DBX12 পদ্ধতিটি নথিভুক্ত না হলেও পদ্ধতিটি নিজেই অবহিত হিসাবে চিহ্নিত নয়। দ্বিতীয় লিঙ্কটি এটি সম্পর্কে একটি সরকারী নোটকে নির্দেশ করে।
মিনিপিফ

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

4
এটি অ্যান্ড্রয়েড 7.1 এ "02: 00: 00: 00: 00: 00" দেখায়।
অ্যান্ড্রয়েড বিকাশকারী

বরং এমুলেটর বা ভার্চুয়াল ডিভাইস ছাড়া শারীর ডিভাইসে পরীক্ষা করা উচিত নয়
দুবে অপরাহ্ন

4
এটি এখনও কাজ করে। ম্যানিফেস্ট ফাইলে ইন্টারনেট অনুমতি দিতে ভুলবেন না।
বিকাল দুবে

4
এটি আর অ্যান্ড্রয়েড মার্শমেলো এবং তার উপরে কাজ করে না কারণ এটি "02: 00: 00: 00: 00: 00"
2

4
এটা কাজ করে। আমি এই কোডটি দীর্ঘদিন ব্যবহার করছি using এটি এখনও Android Q.
রুপম দাস

14

আমি এই সমাধানটি http://robinhenniges.com/en/android6-get-mac-address-programically থেকে প্রতিষ্ঠিত করেছি এবং এটি আমার পক্ষে কাজ করছে! আশা সাহায্য করে!

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

আমি ধরে নিচ্ছি কারণ এটি আমাদের শেষ ":" অক্ষরটি সরিয়ে ফেলতে হবে। এই কোডটি 2 বছর পুরনো এবং সম্ভবত এটি করার সর্বোত্তম উপায় নয়, আপনার এটি অপ্টিমাইজ করা উচিত
তিজিয়ানো ব্রুসচেটা

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

অন্যদের এখানে আছে


হবে macAddressকখনও হতে null?
সর্বোচ্চ হেইবার

ফাংশন কল করার সময় কোন পরমকে প্রসঙ্গ হিসাবে পাস করতে হবে?
ডোনাল

@ ডোনাল মানে কি Context context? যদি হ্যাঁ কোনও প্রসঙ্গে কাজ করা উচিত। বিকাশকারী.অ্যান্ড্রয়েড
রেফারেন্স

8

ইশ ওয়ার্কিং উইথ মার্শমেলো

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

ধন্যবাদ কাদির হুসেন
কেশব গেরা

4

আপনি আর কোনও অ্যান্ড্রয়েড ডিভাইসের হার্ডওয়্যার ম্যাক ঠিকানা পেতে পারবেন না। WifiInfo.getMacAddress () এবং BluetoothAdapter.getAddress () পদ্ধতিগুলি 02: 00: 00: 00: 00: 00 এ ফিরে আসবে। এই বিধিনিষেধটি অ্যান্ড্রয়েড 6.0 এ চালু হয়েছিল।

তবে রব অ্যান্ডারসন এমন একটি সমাধান খুঁজে পেয়েছেন যা <মার্শমেলো: https://stackoverflow.com/a/35830358 এর জন্য কাজ করছে


3

আপনি ম্যাক ঠিকানা পেতে পারেন:

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

ম্যানিফেস্ট.এক্সএমএলে অনুমতি সেট করুন

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

প্রশ্নটি অ্যান্ড্রয়েড ডিভাইসের ম্যাক পাওয়ার বিষয়ে, ওয়াইফাই রাউটারের নয়।
হিনা আব্বাসি


2

অ্যান্ড্রয়েড উত্স থেকে নেওয়া এখানে । এটি প্রকৃত কোড যা সিস্টেমের সেটিংস অ্যাপ্লিকেশনটিতে আপনার ম্যাক ADDRESS দেখায়।

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

অ-অ্যাক্টিভিটি ক্লাস বা খণ্ডে আমার কীভাবে এটি অ্যাক্সেস করা উচিত?
হান্ট

আপনার WifiManager(যেমন WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);) পাওয়ার জন্য একটি প্রসঙ্গের প্রয়োজন হবে ।
ফার্নান্দোহুর

4
যদি এটি এই কোডটি চেষ্টা করে তবে আমি 02:00:00:00:00:00ম্যাক ঠিকানাটি পেয়েছি আসল ওয়াইফাই ম্যাক আইডি নয়
হান্ট

0

আমি জানি এটি একটি খুব পুরানো প্রশ্ন তবে এটি করার জন্য আরও একটি পদ্ধতি রয়েছে। কোড সংকলনের নীচে কিন্তু আমি এটি চেষ্টা করি নি। আপনি কিছু সি কোড লিখতে পারেন এবং ম্যাক ঠিকানা পেতে JNI (জাভা নেটিভ ইন্টারফেস) ব্যবহার করতে পারেন। এখানে মূল ক্রিয়াকলাপের উদাহরণটি দেওয়া হল:

package com.example.getmymac;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class GetMyMacActivity extends AppCompatActivity {
    static { // here we are importing native library.
        // name of the library is libnet-utils.so, in cmake and java code
        // we just use name "net-utils".
        System.loadLibrary("net-utils");
    }

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_screen);

        // some debug text and a TextView.
        Log.d(NetUtilsActivity.class.getSimpleName(), "Starting app...");
        TextView text = findViewById(R.id.sample_text);

        // the get_mac_addr native function, implemented in C code.
        byte[] macArr = get_mac_addr(null);
        // since it is a byte array, we format it and convert to string.
        String val = String.format("%02x:%02x:%02x:%02x:%02x:%02x",
                macArr[0], macArr[1], macArr[2],
                macArr[3], macArr[4], macArr[5]);
        // print it to log and TextView.
        Log.d(NetUtilsActivity.class.getSimpleName(), val);
        text.setText(val);
    }

    // here is the prototype of the native function.
    // use native keyword to indicate it is a native function,
    // implemented in C code.
    private native byte[] get_mac_addr(String interface_name);
}

এবং বিন্যাস ফাইল, main_screen.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/sample_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/app_name"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

ম্যানিফেস্ট ফাইল, আমি কী অনুমতি যোগ করতে জানতাম না তাই আমি কিছু যুক্ত করেছি।

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.getmymac">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity android:name=".GetMyMacActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

Get_mac_addr ফাংশন সি প্রয়োগকারী।

এবং অবশেষে, সিএমকেলিস্ট.টেক্সট ফাইল

cmake_minimum_required(VERSION 3.4.1)
add_library(net-utils SHARED src/main/cpp/net-utils.c)
target_link_libraries(net-utils android log)


-3

আমি মনে করি আমি LOCATION অনুমতি ছাড়াই সবেমাত্র ম্যাক ঠিকানাগুলি পড়ার একটি উপায় খুঁজে পেয়েছি: ip linkএটির আউটপুটটি চালান এবং পার্স করুন। (আপনি সম্ভবত এই বাইনারি এর উত্স কোড দেখে একই কাজ করতে পারে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.