java.lang.SecurityException: BLUETOOTH 权限崩溃。(仅限三星设备)

我遇到以下崩溃,但这只发生在一些三星设备上(不是全部,我们在三星设备上开发/测试)

崩溃日志:

java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10025 nor current process has android.permission.BLUETOOTH.
   at android.os.Parcel.readException(Parcel.java:1540)
   at android.os.Parcel.readException(Parcel.java:1493)
   at android.bluetooth.IBluetooth$Stub$Proxy.isEnabled(IBluetooth.java:1156)
   at android.bluetooth.BluetoothAdapter.isEnabled(BluetoothAdapter.java:697)
   at org.altbeacon.beacon.service.scanner.CycledLeScanner.finishScanCycle(CycledLeScanner.java:245)
   at org.altbeacon.beacon.service.scanner.CycledLeScanner.scheduleScanCycleStop(CycledLeScanner.java:234)
   at org.altbeacon.beacon.service.scanner.CycledLeScanner$1.run(CycledLeScanner.java:230)
   at android.os.Handler.handleCallback(Handler.java:739)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:145)
   at android.app.ActivityThread.main(ActivityThread.java:5972)
   at java.lang.reflect.Method.invoke(Method.java)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

这是我的AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.app.myapp" >


<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!--
     The following two permissions are not required to use Google Maps Android API v2,
     but are recommended. We also require them for location updates.
-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<permission
    android:name=".permission.C2D_MESSAGE"
    android:protectionLevel="signature" />

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

<application
    android:name=".myapp"
    android:allowBackup="true"
    android:icon="@drawable/appicon"
    android:label="@string/app_name"
    android:logo="@drawable/action_bar_pinwheel_back"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".activities.VerifyPinActivity"
        android:label="@string/title_activity_verify_pin"
        android:screenOrientation="portrait"
        android:theme="@style/NoActionBarDark"
        android:windowSoftInputMode="stateVisible|adjustPan" >
    </activity>
    ...(more activities here removed)
</application>
</manifest>

我真的不知道为什么它只发生在少数设备上;我最初的猜测是它与三星KNOX有关,并且崩溃的(少数)用户是具有禁用蓝牙的手机策略的KNOX用户。

还有其他人遇到过这种情况吗?或者有人知道这可能是什么吗?


答案 1

如果您确定用户仅在三星KNOX上遇到此问题,以下答案可能会对您有所帮助。

一步一步地思考是解决问题的方法。

1.This only occurs on some Samsung devices.

因此,它与您的代码无关,也与您的权限无关。三星设备有问题。

2.Check the crash log:  
java.lang.SecurityException: Need BLUETOOTH permission: Neither user 10025 nor current process has android.permission.BLUETOOTH.

根据经验,如果您遇到过“用户****和当前进程都没有***权限”之类的日志,这意味着您的应用程序没有在系统中执行某些操作的权限。这通常发生在您执行需要系统级权限的操作时。

If you are installed as system level app together with customized Android ROM,or you signed your app with the platform.x509.pem and platform.pk8 file of the customized Android ROM,and then you can have the permission.

现在检查什么是三星KNOX:

三星 Knox(风格化的三星 KNOX)是一种企业移动安全解决方案。

蓝牙是一种向对方设备传输数据的方式。这将导致安全问题。

查看官方网站:
https://www.samsungknox.com

搜索关键字“蓝牙”,我们发现了这个:https://www.samsungknox.com/en/faq/are-bluetooth-bluetooth-low-energy-and-nfc-available-inside-knox-container

KNOX 2.4+ — KNOX 容器内支持蓝牙、低功耗蓝牙 (GATT) 和 NFC。

KNOX 2.3 或更低版本 — KNOX 容器内不支持蓝牙、蓝牙 GATT 和 NFC。如果设备连接到个人空间中的外围设备(例如耳机),则即使用户进入 KNOX 容器,蓝牙也将保持连接状态。KNOX 容器内的应用程序无法启动蓝牙连接。

1.如果您的用户使用的是 KNOX 2.3 或更低版本,并且他们可以将其设备的操作系统更新到 KNOX 2.4+.告诉使用三星 KNOX 的用户更新其设备的操作系统。

2.如果您的用户使用的是KNOX 2.3或更低版本,并且他们无法将设备的操作系统更新到KNOX 2.4 +.您的应用程序在这种情况下将无法正常工作,问题不在于问题,您可以做的只是告诉使用:您设备的操作系统不支持蓝牙,因此无法正常工作。

3.如果以上对您没有帮助,您可以联系三星KNOX官方

另一个提示:
为了改善应用的用户体验,您需要防止应用崩溃。
崩溃是最糟糕的用户体验。
如果你不能解决问题,你可以这样做:

 try{
     You code related with Bluetooth.
    }catch (Exception e)
    {
    }

记住:官方总是帮助你更好地解决问题!



答案 2

你可以看看这里。我想这是你的问题。

KNOX 容器内是否提供蓝牙、低功耗蓝牙和 NFC?

KNOX 2.4+ — KNOX 容器内支持蓝牙、低功耗蓝牙 (GATT) 和 NFC。

KNOX 2.3 或更低版本 — KNOX 容器内不支持蓝牙、蓝牙 GATT 和 NFC。如果设备连接到个人空间中的外围设备(例如耳机),则即使用户进入 KNOX 容器,蓝牙也将保持连接状态。KNOX 容器内的应用程序无法启动蓝牙连接。

我从来没有任何实践经验,但我希望这有帮助。


推荐