【发布时间】:2015-09-17 06:28:18
【问题描述】:
在我的应用程序的onCreate() 中,我调用BluetoothAdapter.getAddress()。运行此应用程序的数百台设备会生成java.lang.SecurityException:
java.lang.RuntimeException:无法启动活动 组件信息{xx.yyy.myapp/xx.yyy.myapp.RecActivity}: java.lang.SecurityException:需要蓝牙管理员权限:两者都没有 用户 10095 和当前进程都没有 android.permission.BLUETOOTH_ADMIN。 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 在 android.app.ActivityThread.access$600(ActivityThread.java:141) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:137) 在 android.app.ActivityThread.main(ActivityThread.java:5039) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 在 dalvik.system.NativeStart.main(Native Method) 原因: java.lang.SecurityException:需要蓝牙管理员权限:两者都没有 用户 10095 和当前进程都没有 android.permission.BLUETOOTH_ADMIN。 在 android.os.Parcel.readException(Parcel.java:1425) 在 android.os.Parcel.readException(Parcel.java:1379) 在 android.bluetooth.IBluetoothManager$Stub$Proxy.getAddress(IBluetoothManager.java:295) 在 android.bluetooth.BluetoothAdapter.getAddress(BluetoothAdapter.java:576) 在 xx.yyy.myapp.RecActivity.onCreate(Unknown Source) 在 android.app.Activity.performCreate(Activity.java:5104) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) ... 11 更多
由于我无法在该设备上进行调试,我想问一下以下解决方案是否可行,或者是否有更好的方法来处理问题(这是小于 JELLY_BEAN_MR2 的分支)?
BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter();
try {
macAddress = ( bta != null ) ? bta.getAddress() : "";
} catch ( Exception e ) {
macAddress = "";
}
另外,我想知道该设备上的 Android 版本是否存在错误,因为在我看来 BluetoothAdapter.java 中的 getAddress() 不需要 android.permission.BLUETOOTH_ADMIN?
或者,使用此设备的用户是否有特定的根工具来锁定我的应用程序的蓝牙访问权限?这可能是异常的原因吗?
或者问题的原因是什么?
【问题讨论】:
-
似乎很可能他们有一个根工具。权限锁定工具变得越来越流行,并包含在许多自定义 rom 中。
-
你知道我的解决方法是否会捕获 SecurityException 并避免 RuntimeException 以便应用程序不会崩溃但继续运行?
-
It's bad practice to write
catch(Exception e)in most cases. 在这里,RuntimeException仅在您没有捕捉到SecurityException的情况下才会被ActivityThread单独抛出,因此只需catch(SecurityException e)就足够了。 -
谢谢。我可以判断这是我正在寻找的答案的重要组成部分!
标签: android bluetooth securityexception