某些权限是签名级别的,这意味着除非您的应用使用与系统其余部分签名相同的密钥进行签名,否则无法授予这些权限。如果您需要其中任何一个,那么您几乎无能为力,除非相关 API 有 shell-command 替代方案。
其他权限是特权级别的,这意味着只有当应用位于 /system/priv-app/ 时才会授予它们。您没有提到您正在使用哪些权限,但我建议您将应用程序放在 priv-app 而不是 app 中。如果此设备使用 Lollipop 或更高版本,则应用程序应在 priv-app 内包含一个子文件夹(例如 /system/priv-app/SomeApp/SomeApp.apk)。
第三种是app-op权限。这些不是运行时权限,但可以通过 shell 命令授予:
cmd appops set <PACKAGE> <OP> <MODE>
例如,授予SYSTEM_ALERT_WINDOW 权限:
cmd appops set com.some.package android:system_alert_window allow
第四类是运行时/开发权限。两者都可以通过以下方式授予:
pm grant <PACKAGE> <PERMISSION>
例如授予WRITE_EXTERNAL_STORAGE:
pm grant com.some.package android.permission.WRITE_EXTERNAL_STORAGE
您可以通过查看平台AndroidManifest.xml 来检查您的权限类型。找到您的许可并检查protectionLevel 字段。
-
signature 表示签名
-
privileged 表示特权
-
development 表示发展
-
dangerous 表示运行时
-
normal 权限将被自动授予
某些权限,例如WRITE_SECURE_SETTINGS 具有多个保护级别:signature|privileged|development。
如果满足其中任何一个条件,Android 将向您的应用授予权限。使用 WSS,您可以将应用程序放入 priv-app 或使用 pm grant。无论哪种方式都可以让您访问。
如果权限的保护级别同时具有appops 和development,例如PACKAGE_USAGE_STATS,请小心。使用cmd appops 将为某些功能授予该权限,而pm grant 将为其他功能授予该权限。