14

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

崩溃日志:

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 用户。

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

4

5 回答 5

4

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

现在检查一下什么是三星 KNOX:

Samsung Knox(程式化的 Samsung 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)
    {
    }

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


于 2015-11-01T15:04:27.307 回答
1

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

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

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

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

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

于 2015-11-02T13:22:46.463 回答
0

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

<uses-feature android:name="android.hardware.bluetooth" android:required="true" />
于 2015-10-29T11:33:54.633 回答
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
    }
  }
于 2015-11-02T06:43:55.353 回答
0

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

于 2015-11-02T14:44:47.867 回答