java.lang.SecurityException:AttributionSource 需要 android.permission.BLUETOOTH_CONNECT 权限

N1g*_*sky 27 java android bluetooth android-studio

由于我是第一次提问,所以问题可能有点晕,请谅解。另外,请理解语法可能会很奇怪,因为我英语不好并且使用翻译器。

\n

我是一个在 Android 工作室中使用 java 制作应用程序的人。

\n

尝试使用蓝牙时出现连续错误。错误太多,我可以轻松找到解决方案,但它不适用于我。

\n

错误日志

\n
Process: org.techtown.push.bluetoothtest2, PID: 10852\n    java.lang.RuntimeException: Unable to start activity ComponentInfo{org.techtown.push.bluetoothtest2/org.techtown.push.bluetoothtest2.MainActivity}: java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for AttributionSource { uid = 10158, packageName = org.techtown.push.bluetoothtest2, attributionTag = null, token = android.os.BinderProxy@f43a396, next = null }: AdapterService getBondedDevices\n        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3635)\n        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)\n        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)\n        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\n        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)\n        at android.os.Handler.dispatchMessage(Handler.java:106)\n        at android.os.Looper.loopOnce(Looper.java:201)\n        at android.os.Looper.loop(Looper.java:288)\n        at android.app.ActivityThread.main(ActivityThread.java:7839)\n        at java.lang.reflect.Method.invoke(Native Method)\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)\n     Caused by: java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for AttributionSource { uid = 10158, packageName = org.techtown.push.bluetoothtest2, attributionTag = null, token = android.os.BinderProxy@f43a396, next = null }: AdapterService getBondedDevices\n        at android.os.Parcel.createExceptionOrNull(Parcel.java:2425)\n        at android.os.Parcel.createException(Parcel.java:2409)\n        at android.os.Parcel.readException(Parcel.java:2392)\n        at android.os.Parcel.readException(Parcel.java:2334)\n        at android.bluetooth.IBluetooth$Stub$Proxy.getBondedDevices(IBluetooth.java:3077)\n        at android.bluetooth.BluetoothAdapter.getBondedDevices(BluetoothAdapter.java:2491)\n        at org.techtown.push.bluetoothtest2.MainActivity.showPairedDevicesListDialog(MainActivity.java:300)\n        at org.techtown.push.bluetoothtest2.MainActivity.onCreate(MainActivity.java:80)\n        at android.app.Activity.performCreate(Activity.java:8051)\n        at android.app.Activity.performCreate(Activity.java:8031)\n        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1329)\n        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3608)\n        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3792)\xc2\xa0\n        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:103)\xc2\xa0\n        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)\xc2\xa0\n        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)\xc2\xa0\n        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2210)\xc2\xa0\n        at android.os.Handler.dispatchMessage(Handler.java:106)\xc2\xa0\n        at android.os.Looper.loopOnce(Looper.java:201)\xc2\xa0\n        at android.os.Looper.loop(Looper.java:288)\xc2\xa0\n        at android.app.ActivityThread.main(ActivityThread.java:7839)\xc2\xa0\n        at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)\xc2\xa0\n        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n

我认为中间这句话就是错误的原因。

\n
Caused by: java.lang.SecurityException: Need android.permission.BLUETOOTH_CONNECT permission for AttributionSource { uid = 10158, packageName = org.techtown.push.bluetoothtest2, attributionTag = null, token = android.os.BinderProxy@f43a396, next = null }: AdapterService getBondedDevices\n
Run Code Online (Sandbox Code Playgroud)\n

但我已经应用了该问题的解决方案。这是我的 Manifest.xml。

\n
<?xml version="1.0" encoding="utf-8"?>\n<manifest xmlns:android="http://schemas.android.com/apk/res/android"\n    package="org.techtown.push.bluetoothtest2">\n\n    <uses-permission android:name="android.permission.BLUETOOTH" />\n    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />\n    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />\n    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />\n    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />\n    <uses-feature android:name="android.hardware.bluetooth" android:required="false"/>\n    <uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/>\n\n    <application\n        android:allowBackup="true"\n        android:icon="@mipmap/ic_launcher"\n        android:label="@string/app_name"\n        android:roundIcon="@mipmap/ic_launcher_round"\n        android:supportsRtl="true"\n        android:theme="@style/Theme.Bluetoothtest2">\n        <activity\n            android:name=".MainActivity"\n            android:exported="true">\n            <intent-filter>\n                <action android:name="android.intent.action.MAIN" />\n\n                <category android:name="android.intent.category.LAUNCHER" />\n            </intent-filter>\n        </activity>\n    </application>\n\n</manifest>\n
Run Code Online (Sandbox Code Playgroud)\n

我应用它是因为我发现我需要“android.permission.BLUETOOTH_CONNECT 权限”。然而,错误仍然不断发生。

\n

我误解了什么吗?或者我在mainactivty.java中犯了错误?

\n

供您参考,我在做项目时是这样做的。

\n
\n

最小 sdk:API 16:Android 4.1(果冻豆)

\n
\n

如果您写下的文件没有问题,请告诉我再次检查 Java 代码。\n谢谢。

\n

sna*_*msm 18

从 Android 6.0 开始,并非所有权限都被授予仅仅因为其放置在清单中。你必须用一个来处理运行时权限BLUETOOTH_CONNECT(如何在此处请求)

BLUETOOTH_ADVERTISE、BLUETOOTH_CONNECT 和 BLUETOOTH_SCAN 权限是运行时权限。因此,您必须在应用程序中明确请求用户批准,然后才能查找蓝牙设备、使设备可被其他设备发现或与已配对的蓝牙设备通信。


Cla*_*MBE 15

您应该在 Manifest 和 Activity.java 中声明 BLUETOOTH_SCAN 和权限

例如:

  1. AndroidManifest.xml
<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. -->
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/>
    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"
        tools:ignore="ProtectedPermissions" />
Run Code Online (Sandbox Code Playgroud)
  1. MainActivity.java
    private static String[] PERMISSIONS_STORAGE = {
            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
            Manifest.permission.BLUETOOTH_SCAN,
            Manifest.permission.BLUETOOTH_CONNECT,
            Manifest.permission.BLUETOOTH_PRIVILEGED
    };
    private static String[] PERMISSIONS_LOCATION = {
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION,
            Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
            Manifest.permission.BLUETOOTH_SCAN,
            Manifest.permission.BLUETOOTH_CONNECT,
            Manifest.permission.BLUETOOTH_PRIVILEGED
    };

Run Code Online (Sandbox Code Playgroud)

    private void checkPermissions(){
        int permission1 = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        int permission2 = ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN);
        if (permission1 != PackageManager.PERMISSION_GRANTED) {
            // We don't have permission so prompt the user
            ActivityCompat.requestPermissions(
                    this,
                    PERMISSIONS_STORAGE,
                    1
            );
        } else if (permission2 != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(
                    this,
                    PERMISSIONS_LOCATION,
                    1
            );
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果您将compileSdkVersion和targetSdkVersion添加到您的答案中,那就太好了。 (5认同)