调用 BluetoothAdapter.getDefaultAdapter 时出现 SecurityException

SecurityException when calling BluetoothAdapter.getDefaultAdapter

在我的应用程序的 onCreate() 中调用 BluetoothAdapter.getAddress()。数百个设备中的一个,即 运行 这个应用程序,产生 java.lang.SecurityException:

java.lang.RuntimeException: Unable to start activity ComponentInfo{xx.yyy.myapp/xx.yyy.myapp.RecActivity}: java.lang.SecurityException: Need BLUETOOTH ADMIN permission: Neither user 10095 nor current process has android.permission.BLUETOOTH_ADMIN. at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) at android.app.ActivityThread.access0(ActivityThread.java:141) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5039) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.SecurityException: Need BLUETOOTH ADMIN permission: Neither user 10095 nor current process has android.permission.BLUETOOTH_ADMIN. at android.os.Parcel.readException(Parcel.java:1425) at android.os.Parcel.readException(Parcel.java:1379) at android.bluetooth.IBluetoothManager$Stub$Proxy.getAddress(IBluetoothManager.java:295) at android.bluetooth.BluetoothAdapter.getAddress(BluetoothAdapter.java:576) at xx.yyy.myapp.RecActivity.onCreate(Unknown Source) at android.app.Activity.performCreate(Activity.java:5104) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) ... 11 more

由于我无法在该设备上进行调试,所以想请问以下解决方案是否可行,或者是否有更好的方法来处理问题(这是小于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

或者使用此设备的用户是否有特定的 root 工具来锁定我的应用程序的蓝牙访问?这可能是异常的原因?

或者问题的原因可能是什么?

因为it's bad practice to use catch(Exception e),使用

} catch(SecurityException e){

防止崩溃。

(现在作为答案而不是评论。)