You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

部分Android 7设备中ADB蓝牙开关命令及驱动启动Activity失效问题

解决Android 7设备ADB操作蓝牙/Activity权限失效问题

看起来你在Android 7设备上用ADB操作蓝牙或者启动相关Activity时碰到了权限拦路虎——这个问题其实是Android 7(API 24)开始的系统权限管控收紧导致的,我来给你拆解解决方案:

问题本质

你收到的Parcel解析提示已经把原因说的很清楚了:ADB默认以用户2000身份运行,而该用户及当前进程都没有android.permission.BLUETOOTH_ADMIN权限。从Android 6开始,BLUETOOTH_ADMIN属于危险权限范畴,系统对后台进程(包括ADB shell)的权限校验变得更严格,直接调用蓝牙控制或相关Activity的命令会被拦截。

具体解决方案

方案1:临时授予ADB进程权限(快速生效)

直接通过pm grant命令给ADB对应的系统shell包授予BLUETOOTH_ADMIN权限,执行以下命令:

adb shell pm grant com.android.shell android.permission.BLUETOOTH_ADMIN

执行完成后,再尝试你的蓝牙操作命令(比如启用蓝牙的adb shell am start -a android.bluetooth.adapter.action.REQUEST_ENABLE,或者调用蓝牙服务的相关指令),应该就能正常执行了。

方案2:设置设备所有者(长期自动化场景适用)

如果你的设备需要长期通过ADB执行蓝牙操作,建议将ADB shell设置为设备所有者,这样能获得更高的系统权限,绕过常规权限检查:

  1. 先清除现有设备所有者(如果设备之前设置过的话):
    adb shell dpm remove-active-admin <admin-component>
    
    (注:<admin-component>需要替换为当前设备所有者的组件名,比如com.example.myadmin/.MyAdminReceiver,如果不确定可以先执行adb shell dpm list-active-admin查看)
  2. 将ADB shell设置为设备所有者:
    adb shell dpm set-device-owner com.android.shell/.ShellDeviceOwnerReceiver
    
    设置完成后,ADB shell就能长期拥有包括BLUETOOTH_ADMIN在内的高权限,无需每次手动授予。

补充说明

  • Android 7及以上版本中,普通APP需要同时在Manifest声明BLUETOOTH_ADMIN并请求运行时权限,但ADB作为系统级进程,需要通过pm grant或者设备所有者的方式获取权限。
  • 如果操作后仍然失效,可以尝试重启ADB服务(adb kill-server && adb start-server)或者重启设备,确保权限生效。

内容的提问来源于stack exchange,提问作者ARods

火山引擎 最新活动