Android获取Mac地址 蓝牙 Wi-Fi

获取MAC 地址

获取Wi-Fi MAC

直接上代码:

 public static String getMacAddrByIp() {
        String strMacAddr = null;
        try {
            // 获得IpD地址
            InetAddress ip = getLocalInetAddress();
            byte[] b = NetworkInterface.getByInetAddress(ip)
                    .getHardwareAddress();
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < b.length; i++) {
                if (i != 0) {
                    buffer.append(':');
                }
                String str = Integer.toHexString(b[i] & 0xFF);
                buffer.append(str.length() == 1 ? 0 + str : str);
            }
            strMacAddr = buffer.toString().toUpperCase();
        } catch (Exception e) {
        }
        return strMacAddr;
    }

    /**
     * 获取移动设备本地IP
     *
     * @return
     */
    public static InetAddress getLocalInetAddress() {
        InetAddress ip = null;
        try {
            // 列举
            Enumeration<NetworkInterface> en_netInterface = NetworkInterface
                    .getNetworkInterfaces();
            while (en_netInterface.hasMoreElements()) {// 是否还有元素
                NetworkInterface ni = (NetworkInterface) en_netInterface
                        .nextElement();// 得到下一个元素
                Enumeration<InetAddress> en_ip = ni.getInetAddresses();// 得到一个ip地址的列举
                while (en_ip.hasMoreElements()) {
                    ip = en_ip.nextElement();
                    if (!ip.isLoopbackAddress()
                        /* && ip.getHostAddress().indexOf(":") == -1*/)
                        break;
                    else
                        ip = null;
                }

                if (ip != null) {
                    break;
                }
            }
        } catch (SocketException e) {

            e.printStackTrace();
        }
        return ip;
    }

ip.getHostAddress().indexOf(":") == -1 这个注释掉就是不取,IPv6的地址。
以上代码注意一个问题:就是如果使用的流量网络,就是IP是流量网络给予的,那么会取成流量网络的MAC。这个MAC是会变更。

如果需要单独取Wi-Fi的MAC,就需要下面的方法。
NetworkInterface 这个类会把机器所有涉及到网络的东西都取出来。

 public static String getMachineHardwareAddress() {
        Enumeration<NetworkInterface> interfaces = null;
        try {
            interfaces = NetworkInterface.getNetworkInterfaces();
        } catch (SocketException e) {
            e.printStackTrace();
        }
        String hardWareAddress = null;
        NetworkInterface iF = null;
        if (interfaces == null) {
            return null;
        }
        while (interfaces.hasMoreElements()) {
            iF = interfaces.nextElement();
                /*List<InetAddress> list = Collections.list(iF.getInetAddresses());
                for (InetAddress ip : list) {
                输出这个设备下面的所有IP,会有回路IP,127。0。0。0这种
                }*/

            try {
                hardWareAddress = bytesToString(iF.getHardwareAddress());
                /*if (hardWareAddress != null)
                    break;*/
            } catch (SocketException e) {
                e.printStackTrace();
            }
        }
        return hardWareAddress;
    }

上面的方法是取最后一个,需要的大家自己改。Wi-Fi的名字叫wlan0,有线的一般叫eth0.具体的看系统。这两个是不会变的,其他的会改变。

Android 10强制要求MAC是随机的,上面的方法取得也是随机的,真实的IP需要使用DevicePolicyManager.getWifiMacAddress(@NonNull ComponentName admin).这个权限基本没有,大家可以不用想了。

蓝牙(Bluetooth)MAC

蓝牙的只介绍高版本的,常规手法大家都知道的。

 @TargetApi(23)
    public static String getBluetoothAddressSdk23(BluetoothAdapter adapter) {
        if (adapter == null) return null;

        Class<? extends BluetoothAdapter> btAdapterClass = adapter.getClass();
        try {
            Class<?> btClass = Class.forName("android.bluetooth.IBluetooth");
            Field bluetooth = btAdapterClass.getDeclaredField("mService");
            bluetooth.setAccessible(true);
            Method method = btClass.getMethod("getAddress");
            Method method1 = bluetooth.get(adapter).getClass().getMethod("getAddress");
            return (String) bluetooth.get(adapter).getClass().getMethod("getAddress").invoke(bluetooth.get(adapter));

        } catch (Exception e) {
            e.printStackTrace();
            return adapter.getAddress();
        }
    }

注意上面的代码,method和method1。

public abstract java.lang.String android.bluetooth.IBluetooth.getAddress() throws android.os.RemoteException   //method
public java.lang.String android.bluetooth.IBluetooth$Stub$Proxy.getAddress() throws android.os.RemoteException  //method1

虽然不影响,但是能看出来具体的东东。

Android9,还是10以后,反射不行了,反射也是需要权限的.调用上面的代码会告诉你需要LOCAL_MAC_ADDRESS。这个权限是需要系统ID的。

以上,完毕。谢谢大家。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好!对于 Android Wi-Fi 直连传输数据的实践,可以使用 AndroidWi-Fi P2P(Wi-Fi Direct)功能来实现。下面是一个简单的示例代码,演示了如何在两台设备之间进行 Wi-Fi 直连传输数据: 首先,在 AndroidManifest.xml 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permission android:name="android.permission.INTERNET"/> ``` 然后,在你的 Activity 中添加以下代码: ```java private WifiP2pManager mManager; private WifiP2pManager.Channel mChannel; private BroadcastReceiver mReceiver; private IntentFilter mIntentFilter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化 Wi-Fi P2P 相关对象 mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE); mChannel = mManager.initialize(this, getMainLooper(), null); // 注册广播接收器,用于接收 Wi-Fi P2P 相关的系统广播 mReceiver = new WiFiDirectBroadcastReceiver(); mIntentFilter = new IntentFilter(); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); mIntentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); } @Override protected void onResume() { super.onResume(); registerReceiver(mReceiver, mIntentFilter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(mReceiver); } // 开始 Wi-Fi P2P 搜索设备 public void discoverPeers(View view) { mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { // 搜索成功 } @Override public void onFailure(int reasonCode) { // 搜索失败 } }); } // 连接到指定设备 public void connectToDevice(WifiP2pDevice device) { WifiP2pConfig config = new WifiP2pConfig(); config.deviceAddress = device.deviceAddress; mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() { @Override public void onSuccess() { // 连接成功 } @Override public void onFailure(int reason) { // 连接失败 } }); } // 发送数据 public void sendData(byte[] data) { // 通过 Socket 发送数据 // 这里省略具体实现代码 } // 接收数据 public void receiveData(byte[] data) { // 通过 Socket 接收数据 // 这里省略具体实现代码 } // 广播接收器,用于接收 Wi-Fi P2P 相关的系统广播 private class WiFiDirectBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) { // Wi-Fi P2P 状态变化 } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) { // 可用的对等设备列表发生变化 } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) { // Wi-Fi P2P 连接状态发生变化 } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) { // 本设备的信息发生变化 } } } ``` 以上是一个简单的 Android Wi-Fi 直连传输数据的实践示例,其中涉及到了 Wi-Fi P2P 的搜索设备、连接设备以及发送和接收数据的过程。需要注意的是,具体的发送和接收数据的实现需要借助 Socket 或其他网络通信方式来完成,这里只是一个简单的示例。 希望对您有所帮助!如果有任何问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值