关于如何通过ADB授权脚本自动开启无障碍权限
什么是ADB
谷歌安卓开发官网解释
- Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:
- 客户端:用于发送命令。客户端在开发计算机上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
- 守护程序 (adbd):用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
- 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。
- 更多介绍见官网
不管那么多术语
- 简而言之就是一个开发调试工具,在这里我们主要关注它的功能是用来授权
如何使用
准备工作
- 首先是下载ADB工具,解压到自己电脑上。如果想经常使用ADB可以将它加入到环境变量中,这里不做介绍。
- 下载渠道
- 然后手机需要进入开发者模式,并开启USB调试功能
- 进入设置-关于手机-连续点击版本号多次(一般是7次,会有提示)开启开发者模式。小米是连续点击MIUI版本号。
- 开启后进入设置-更多设置-开发者选项 找到USB调试,点击开启它,同时有些系统会有子项-USB调试(安全设置)也需要一起开启,否则授权会无效。
开始授权操作
-
以上步骤完成后,将手机通过USB连接到电脑上,手机上会弹框提示是否授权USB调试,点击确定即可。
-
打开电脑上的cmd、terminal或者powershell,进入到解压的ADB所在的文件夹,输入adb devices 如果一切正常会显示如下内容
List of devices attached d8cfe91f device
-
然后输入授权命令即可,‘’ 替换成实际的AutoJS包名。通过脚本运行toastLog(context.getPackageName())可以获取包名,或者通过应用设置查看(不同系统不一样这里不做举例)
adb shell pm grant '$packageName$' android.permission.WRITE_SECURE_SETTINGS
-
输入命令回车,无报错则执行成功,如果要撤销授权,输入如下命令即可
adb shell pm revoke '$packageName$' android.permission.WRITE_SECURE_SETTINGS
完成授权
- 以后可以直接关闭USB调试和开发者选项,设备重启也不受影响,脚本都能够自动获取无障碍权限
出现错误
Security exception: grantRuntimePermission: Neither user 2000 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS.
java.lang.SecurityException: grantRuntimePermission: Neither user 2000 nor current process has android.permission.GRANT_RUNTIME_PERMISSIONS.
at android.app.ContextImpl.enforce(ContextImpl.java:1906)
at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1934)
at com.android.server.pm.permission.PermissionManagerService.grantRuntimePermission(PermissionManagerService.java:2109)
at com.android.server.pm.permission.PermissionManagerService.access$900(PermissionManagerService.java:122)
at com.android.server.pm.permission.PermissionManagerService$PermissionManagerServiceInternalImpl.grantRuntimePermission(PermissionManagerService.java:3088)
at com.android.server.pm.PackageManagerService.grantRuntimePermission(PackageManagerService.java:5870)
at com.android.server.pm.PackageManagerShellCommand.runGrantRevokePermission(PackageManagerShellCommand.java:1955)
at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:230)
at android.os.ShellCommand.exec(ShellCommand.java:111)
at com.android.server.pm.PackageManagerService.onShellCommand(PackageManagerService.java:22434)
at android.os.Binder.shellCommand(Binder.java:881)
at android.os.Binder.onTransact(Binder.java:765)
at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4924)
at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:4110)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
如果授权时,出现权限错误,需要开发者选项中 打开 USB调试(安全设置)
java代码开启
上方权限授予后,java代码开启:
//自动开启无障碍服务
fun autoOpenAccessibilityService(context: Context, classPath: String) {
Settings.Secure.putString(
context.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES,
classPath
)//例子:"com.xxx.xxxx/com.xxx.xxxx.service.MyAccessibilityService"
Settings.Secure.putString(
context.contentResolver,
Settings.Secure.ACCESSIBILITY_ENABLED, "1"
)
}
//自动关闭无障碍服务
fun autoCloseAccessibilityService(context: Context, classPath: String) {
Settings.Secure.putString(
context.contentResolver,
Settings.Secure.ACCESSIBILITY_ENABLED,
classPath
)//例子:"com.xxx.xxxx/com.xxx.xxxx.service.MyAccessibilityService"
Settings.Secure.putString(
context.contentResolver,
Settings.Secure.ACCESSIBILITY_ENABLED, "0"
)
}