调用 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){
防止崩溃。
(现在作为答案而不是评论。)
在我的应用程序的 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){
防止崩溃。
(现在作为答案而不是评论。)