我如何通过编程方式获取Android设备的Mac Id.我已经完成了IMIE Code,我知道如何手动检查设备上的Mac ID,但不知道如何以编程方式查找.
Rag*_*aju 119
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
WifiInfo wInfo = wifiManager.getConnectionInfo();
String macAddress = wInfo.getMacAddress();
Run Code Online (Sandbox Code Playgroud)
此外,在清单文件中添加以下权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
Run Code Online (Sandbox Code Playgroud)
请参阅Android 6.0更改.
为了向用户提供更好的数据保护,从此版本开始,Android会删除使用Wi-Fi和蓝牙API对应用程序的设备本地硬件标识符的编程访问.WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()方法现在返回一个常量值02:00:00:00:00:00.
要通过蓝牙和Wi-Fi扫描访问附近外部设备的硬件标识符,您的应用现在必须具有ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限.
Who*_*ome 14
请参阅这篇文章,其中我提交了Utils.java示例以提供纯java实现,并且无需WifiManager即可工作.一些Android设备可能没有可用的wifi或使用以太网接线.
Utils.getMACAddress("wlan0");
Utils.getMACAddress("eth0");
Utils.getIPAddress(true); // IPv4
Utils.getIPAddress(false); // IPv6
Run Code Online (Sandbox Code Playgroud)
它正在工作
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) + ":");
res1.append(String.format("%02X:",b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
//handle exception
}
return "";
}
}
Run Code Online (Sandbox Code Playgroud)
更新 1
这个答案有一个错误,即十六进制形式的字节只有一个数字,在它之前不会出现“0”。附加到res1
已更改以处理它。
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
// res1.append(Integer.toHexString(b & 0xFF) + ":");
res1.append(String.format("%02X:",b));
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,您还可以在Android 6.0中获得MacAddress
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) + ":");
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";
}
Run Code Online (Sandbox Code Playgroud)
编辑1. 这个答案有一个错误,一个以十六进制形式得到一个数字的字节,在它之前不会出现"0".res1的附加内容已更改为处理它.
Developer.Android.com 的最新更新
不使用 MAC 地址 MAC 地址是全局唯一的,用户不可重置,并且在恢复出厂设置后仍然有效。由于这些原因,通常不建议使用 MAC 地址进行任何形式的用户识别。运行 Android 10(API 级别 29)及更高版本的设备会向所有非设备所有者应用程序报告随机 MAC 地址。
在 Android 6.0(API 级别 23)和 Android 9(API 级别 28)之间,本地设备 MAC 地址(例如 Wi-Fi 和蓝牙)无法通过第三方 API 获取。WifiInfo.getMacAddress() 方法和BluetoothAdapter.getDefaultAdapter().getAddress() 方法均返回02:00:00:00:00:00。
此外,在 Android 6.0 和 Android 9 之间,您必须拥有以下权限才能通过蓝牙和 Wi-Fi 扫描访问附近可用外部设备的 MAC 地址:
所需的方法/属性权限
ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION
归档时间: |
|
查看次数: |
86246 次 |
最近记录: |