Java を使用して Android デバイスの MAC アドレスを取得する必要があります。オンラインで検索しましたが、有用なものは見つかりませんでした。
13 に答える
コメントで既に指摘したように、MAC アドレスはWifiManager経由で受け取ることができます。
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 の変更点を参照してください。
ユーザーにより優れたデータ保護を提供するために、このリリース以降、Android は、Wi-Fi および Bluetooth API を使用するアプリのデバイスのローカル ハードウェア識別子へのプログラムによるアクセスを削除します。WifiInfo.getMacAddress() および BluetoothAdapter.getAddress() メソッドは、02:00:00:00:00:00 の定数値を返すようになりました。
Bluetooth および Wi-Fi スキャンを介して近くの外部デバイスのハードウェア識別子にアクセスするには、アプリに ACCESS_FINE_LOCATION または ACCESS_COARSE_LOCATION 権限が必要です。
MAC アドレスの取得はWifiInfo.getMacAddress()
Marshmallow 以降では機能しません。無効になっているため、定数値02:00:00:00:00:00
が返されます。
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";
}
<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;
}
他の人がここにいる
そのマシュマロでの作業
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 "";
}
}
Android デバイスのハードウェア MAC アドレスを取得できなくなりました。WifiInfo.getMacAddress() および BluetoothAdapter.getAddress() メソッドは 02:00:00:00:00:00 を返します。この制限は Android 6.0 で導入されました。
しかし、Rob Anderson は < Marshmallow で機能するソリューションを見つけました: https://stackoverflow.com/a/35830358
MACアドレスを取得できます:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wInfo = wifiManager.getConnectionInfo();
String mac = wInfo.getMacAddress();
Menifest.xml で権限を設定する
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
この簡単な方法を使用して
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String WLANMAC = wm.getConnectionInfo().getMacAddress();
こちらのAndroidソースから取得。これは、システムの設定アプリで MAC アドレスを表示する実際のコードです。
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);
}
このコマンドは、Termux で wifi ハードウェア アドレスを決定する方法ip link | grep -A1 wlan0
の Android 9 で機能します。
LOCATION パーミッションなしで MAC アドレスを読み取る方法を見つけたと思いip link
ます。その出力を実行して解析します。(おそらく、このバイナリのソース コードを見て同様のことができます)