如果我想使用蓝牙和 Target SDK 31 但我的最低 SDK 是 23,我需要 Android 上的什么权限?

What permissions would I need on Android if I want to use Bluetooth and Target SDK 31 but my minimum SDK is 23?

问题: 我想在 Android 上制作一个需要蓝牙功能的应用程序,但我不太确定需要什么权限。我要离开这个文档 https://developer.android.com/guide/topics/connectivity/bluetooth/permissions,但措辞让我感到困惑。在我的应用程序 gradle 文件中,我的 targetSdkcompileSdk 都设置为 31,即 Android 12。我的 minSdk 设置为 23,但是这将是Android 6.0。至少我知道我的应用程序需要能够扫描蓝牙设备、连接设备并与之通信。我的应用程序不会从蓝牙扫描中获取位置。

我需要的最低权限如下所示:


<manifest>
    <!-- Request legacy Bluetooth permissions on older devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH"
                     android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"
                     android:maxSdkVersion="30" />

    <!-- Needed only if your app looks for Bluetooth devices.
         If your app doesn't use Bluetooth scan results to derive physical
         location information, you can strongly assert that your app
         doesn't derive physical location. -->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />

    <!-- Needed only if your app communicates with already-paired Bluetooth
         devices. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

    ...
</manifest>

这来自“目标 Android 12 或更高”下的链接网页,但我想知道我是否还需要遵守“目标 Android 11 或更低”部分因为我的最低 Android SDK 是 Android 6.0。那么我是否适合遵循 Android 12 目标指令或 Android 11 或更低目标指令?

您将检查 android 版本。然后,如果 Android 为 12 或更高,则执行 A,如果为 11 或更低,则执行 B。使用下面的 link 了解有关构建版本的更多信息

https://developer.android.com/reference/android/os/Build.VERSION

您可以按如下方式使用蓝牙权限,将 targetSdk 设置为 31,将 minSdk 设置为 23

    <uses-permission
        android:name="android.permission.BLUETOOTH"
        android:maxSdkVersion="30" />
    <uses-permission
        android:name="android.permission.BLUETOOTH_ADMIN"
        android:maxSdkVersion="30" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission
        android:name="android.permission.BLUETOOTH_SCAN"
        android:usesPermissionFlags="neverForLocation"
        tools:targetApi="s" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

然后在请求权限时,

    private String[] getRequiredPermissions() {
        int targetSdkVersion = getApplicationInfo().targetSdkVersion;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S && targetSdkVersion >= Build.VERSION_CODES.S) {
            return new String[]{Manifest.permission.BLUETOOTH_SCAN, Manifest.permission.BLUETOOTH_CONNECT};
        } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && targetSdkVersion >= Build.VERSION_CODES.Q) {
            return new String[]{Manifest.permission.ACCESS_FINE_LOCATION};
        } else return new String[]{Manifest.permission.ACCESS_COARSE_LOCATION};
    }