安卓权限错误

4
我创建了一个应用程序,可以启用蓝牙并发现其他设备。 在清单文件中,我有以下内容:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

然而,在设备上出现了这个异常:
11-20 08:08:47.766: E/AndroidRuntime(9380): FATAL EXCEPTION: main
11-20 08:08:47.766: E/AndroidRuntime(9380): java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10111 nor current process has android.permission.BLUETOOTH.

我还需要添加什么到清单文件中,以使其正常工作?

以下是清单文件内容:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="cajun.meet"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />

<application android:icon="@drawable/icon" android:label="@string/app_name">

    <activity android:name=".CajunMeetActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".MyULCard"
              android:label="@string/app_name">
    </activity>

    <activity android:name=".MyULContacts"
              android:label="@string/app_name">
    </activity>

    <service android:name = ".BluetoothExchange" android:exported="true" android:enabled="true">
    </service>

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

</application>
</manifest>

你能发布你的清单文件吗? - user370305
1
尝试将权限标签移动到活动标签之前。 - iTurki
5个回答

10

尝试将权限移到<application>标记之外。如下所示:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="cajun.meet"
  android:versionCode="1"
  android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application android:icon="@drawable/icon" android:label="@string/app_name">

    <activity android:name=".CajunMeetActivity"
              android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name=".MyULCard"
              android:label="@string/app_name">
    </activity>

    <activity android:name=".MyULContacts"
              android:label="@string/app_name">
    </activity>

    <service android:name = ".BluetoothExchange" android:exported="true" android:enabled="true">
    </service>

</application>
</manifest>

我的代码也在<application>标签外面,但我仍然遇到了与原帖作者完全相同的问题。 - WebViewer

2
将 uses-permission 标签移到 application 元素之外。Uses-permission 是 manifest 的子元素,而不是 application。请参见完整的结构 此处

2
把它移到应用程序外面:
    </application>
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
</manifest>

请参阅文档中的此处,其中uses-permission<manifest>的子元素。

1
如果使用 Android 的 Marshmallow 版本,则添加以下代码:
由于 API 23(Marshmallow)版本的安全性提高,此错误是由于安全性问题引起的。现在 Android 要求获得许可。
if (android.os.Build.VERSION.SDK_INT >= 23) {
        // only for gingerbread and newer versions
        String permission = Manifest.permission.READ_PHONE_STATE;
        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.READ_PHONE_STATE}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
        } else {
            // Add your function here which open camera
        }
    } else {
        // Add your function here which open camera
    }

然后添加这个方法 onRequestPermissionsResult
    @Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED{ } else { Toast.makeText(getApplication(), "Permission required",Toast.LENGTH_LONG).show(); } return; } }}

2
BLUETOOTH和BLUETOOTH_ADMIN在Android中不被视为“危险权限”,因此无需向用户请求明确授权。请查阅Android文档 - fast3r

0
正如许多人所建议的那样,将BT权限移到<application>标签之外是消除此SecurityException的关键:
<uses-sdk android:minSdkVersion="8" />

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application android:icon="@drawable/icon" android:label="@string/app_name">

然而...在我的情况下,我使用了自己的库来开发应用程序(唯一涉及到BT的代码),我发现将这两个权限放置在应用程序清单中是至关重要的,而不是放在库的清单中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接