Android 设备的 Wi-Fi MAC 和蓝牙 MAC 地址

在现代智能手机中,尤其是 Android 设备,网络连接和设备之间的通信是不可或缺的。每个网络接口(如 Wi-Fi 和蓝牙)都有其唯一的标识符,即 MAC 地址。本文将探讨 Android 设备中 Wi-Fi 和蓝牙 MAC 地址的获取方式,并介绍它们的用途和相关代码示例。

什么是 MAC 地址?

MAC 地址(媒体访问控制地址)是分配给网络接口的一组唯一标识符,用于设备在网络中的通信。每一个网络设备(如你的手机、路由器等)都有一个唯一的 MAC 地址,这个地址通常是由制造商分配的,通常格式为 00:1A:2B:3C:4D:5E。

Android 中获取设备的 Wi-Fi 和蓝牙 MAC 地址

在 Android 中,我们可以通过 API 获取到设备的 Wi-Fi 和蓝牙 MAC 地址。以下是获取这些地址的代码示例。

获取 Wi-Fi MAC 地址

获取 Android 设备的 Wi-Fi MAC 地址时,可以使用 WifiManager 类。请注意,从 Android 6.0 (API 23) 开始,直接获取 Wi-Fi MAC 地址变得更加严格,需要额外的权限。

import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;

public String getWifiMacAddress(Context context) {
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    return wifiInfo.getMacAddress();
}

获取蓝牙 MAC 地址

获取蓝牙 MAC 地址相对简单,可以使用 BluetoothAdapter 类。

import android.bluetooth.BluetoothAdapter;

public String getBluetoothMacAddress() {
    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    return bluetoothAdapter.getAddress();
}

权限管理

从 Android 6.0 开始,获取 Wi-Fi MAC 地址需要 ACCESS_WIFI_STATE 权限。因此,我们需要在 AndroidManifest.xml 文件中添加以下权限:

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

同时,在实际运行中,确保申请这些权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}

Wi-Fi 和蓝牙 MAC 地址的用途

  1. 设备识别:在连接网络或进行配对时,MAC 地址可以帮助识别设备。
  2. 网络管理:网络管理员可以使用 MAC 地址来限制某些设备的网络访问。
  3. 安全性:一些安全协议可能会使用 MAC 地址来验证设备的身份。

状态图

为了更好地理解如何在 Android 应用程序中获取 MAC 地址的流程,我们可以使用状态图来表示。

stateDiagram
    [*] --> 获取MAC地址
    获取MAC地址 --> 检查权限
    检查权限 -->|已授权| 获取WiFiMAC
    检查权限 -->|未授权| 请求权限
    请求权限 --> 检查权限
    获取WiFiMAC --> 获取蓝牙MAC
    获取蓝牙MAC --> [*]

代码实现示例

结合以上的代码示例,我们可以在一个简单的应用中获取到 Wi-Fi 和蓝牙的 MAC 地址。以下是一个完整的 Activity 示例:

import android.Manifest;
import android.content.pm.PackageManager;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.bluetooth.BluetoothAdapter;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) 
            != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
        } else {
            displayMacAddresses();
        }
    }

    private void displayMacAddresses() {
        String wifiMac = getWifiMacAddress();
        String bluetoothMac = getBluetoothMacAddress();
        // TODO: Update UI to display the MAC addresses
    }

    private String getWifiMacAddress() {
        WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiManager.getConnectionInfo();
        return wifiInfo.getMacAddress();
    }

    private String getBluetoothMacAddress() {
        BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        return bluetoothAdapter.getAddress();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 1) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                displayMacAddresses();
            }
        }
    }
}

甘特图

以下是项目的实施进度甘特图,其中显示了每个阶段的时间安排。

gantt
    title 项目进度
    dateFormat  YYYY-MM-DD
    section 获取Wi-Fi MAC地址
    权限检查          :a1, 2023-01-01, 3d
    获取地址          :after a1  , 5d
    section 获取蓝牙 MAC地址
    权限检查          :b1, 2023-01-05, 2d
    获取地址          :after b1  , 4d

结论

了解 Android 中 Wi-Fi 和蓝牙的 MAC 地址对开发者具有重要意义。一方面,它允许我们在设备间进行网络通信和配对,另一方面,通过适当的权限和安全措施,确保了用户的隐私和数据安全。希望本文对您理解和获取 Android 设备的 MAC 地址有所帮助。