【问题标题】:java.lang.SecurityException: BLUETOOTH permission crash. (Samsung devices only)java.lang.SecurityException:蓝牙权限崩溃。 (仅限三星设备)
【发布时间】:2015-10-20 20:12:46
【问题描述】:

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

崩溃日志:

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

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

【问题讨论】:

  • 即使您的清单中有使用许可,用户也可以禁用给定应用程序的任何许可,也许是这种情况?一个非常疯狂的猜测。
  • 另一个猜测:添加 android.permission.BLUETOOTH_PRIVILEGED 权限。也许这个答案(甚至是下一个)stackoverflow.com/a/18322851/4618338 也会有所帮助。
  • @TrynkiewiczMariusz 这也是我的第一个猜测。我猜想将应用程序安装到 KNOX 沙盒模式,然后在其中禁用蓝牙?我不确定 KNOX 是如何工作的

标签: java android bluetooth android-permissions samsung-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:

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

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

查看官网:
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)
    {
    }

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


【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • Play 商店已经需要蓝牙功能;它会在请求蓝牙权限时自动添加。这可能有助于禁止将其安装在 KNOX 环境中?不过,我什至不确定 KNOX 是不是这里的问题。
      【解决方案4】:

      从 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
          }
        }
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 不确定这是否相关;该应用程序可以正常安装到 KNOX 容器中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 1970-01-01
        • 2017-10-13
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 2022-09-27
        相关资源
        最近更新 更多