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

时间:2015-10-20 20:12:46

标签: java android bluetooth android-permissions samsung-knox

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

崩溃日志:

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用户,以禁用蓝牙。

有没有其他人遇到这个?或者有人知道这可能是什么?

5 个答案:

答案 0 :(得分:3)

如果您确定用户仅在Samsung 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.

现在查看Samsung KNOX是什么:

Samsung Knox (stylized Samsung KNOX) is an enterprise mobile security solution.

  

蓝牙是另一种数据传输方式   device.This会导致安全问题。

查看官方网站:
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.如果上述情况对您没有帮助,您可以与Samsung KNOX Official

联系

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

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

请记住:官方总是可以帮助您更好地解决问题!

答案 1 :(得分:1)

您可以查看here。我猜这是你的问题。

  

KNOX容器内是否有蓝牙,低功耗蓝牙和NFC?

     

KNOX 2.4 + - KNOX容器内部支持蓝牙,低功耗蓝牙(GATT)和NFC。

     

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

我从未有过这方面的实践经验,但我希望这会有所帮助。

答案 2 :(得分:0)

尝试将以下内容添加到您的清单

<uses-feature android:name="android.hardware.bluetooth" android:required="true" />

答案 3 :(得分:0)

从SDK 23开始,您需要在需要时检查蓝牙权限。

   if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
         if (mContext.checkSelfPermission(Manifest.permission.BLUETOOTH) == PackageManager.PERMISSION_GRANTED) {
//TODO - Do the work
    }
  }

答案 4 :(得分:0)

从KNOX Premium v​​1.1开始,三星不再需要签署第三方应用(APK)文件,以便它们可以在KNOX容器内运行。相反,在应用程序成功激活其ELM和KLM许可证后,将在运行时授予相应的权限。有关详细信息,请参阅this