概述
在Android中有些权限只能有系统签名的app才能申请,第三方app不能申请。
如果要开放某个权限给第三方,我们只能修改系统源码。
android.permission.WRITE_MEDIA_STORAGE 是SD卡写权限,只有系统签名的app才可以申请。
第三方app如果要写SD卡 只能用 SAF,但是SAF对用户来说操作不方便。
我的思路很简单,把 android.permission.WRITE_MEDIA_STORAGE 开放给第三方应用。
如何查看每个app已经申请的权限,可以查看 data/system/packages.xml
要想分析 第三方应用为什么不能申请 android.permission.WRITE_MEDIA_STORAGE
分析过程比较麻烦
直接给出修改结果(以Android 6.0 为例)
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace,
String packageOfInterest) {
………………………………………………
…………………………………………
switch (level) {
case PermissionInfo.PROTECTION_NORMAL: {
// For all apps normal permissions are install time ones.
grant = GRANT_INSTALL;
} break;
case PermissionInfo.PROTECTION_DANGEROUS: {
if (pkg.applicationInfo.targetSdkVersion
<= Build.VERSION_CODES.LOLLIPOP_MR1) {
// For legacy apps dangerous permissions are install time ones.
grant = GRANT_INSTALL_LEGACY;
} else if (origPermissions.hasInstallPermission(bp.name)) {
// For legacy apps that became modern, install becomes runtime.
grant = GRANT_UPGRADE;
} else if (mPromoteSystemApps
&& isSystemApp(ps)
&& mExistingSystemPackages.contains(ps.name)) {
// For legacy system apps, install becomes runtime.
// We cannot check hasInstallPermission() for system apps since those
// permissions were granted implicitly and not persisted pre-M.
grant = GRANT_UPGRADE;
} else {
// For modern apps keep runtime permissions unchanged.
grant = GRANT_RUNTIME;
}
} break;
case PermissionInfo.PROTECTION_SIGNATURE: {
// For all apps signature permissions are install time ones.
allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);
if (allowedSig || perm.equals("android.permission.WRITE_MEDIA_STORAGE") ) {
//subingxi open WRITE_MEDIA_STORAGE for all app
grant = GRANT_INSTALL;
}
} break;
}
上面的代码是我已经修改过的。
在 grantPermissionsLPw 方法的 case PermissionInfo.PROTECTION_SIGNATURE 中
if (allowedSig )
修改为
if (allowedSig || perm.equals(“android.permission.WRITE_MEDIA_STORAGE”) )
这个if 为true 是关键,如果你想某个app可以申请全部权限
if (allowedSig || pkg.packageName.equals(你APP包名))
这样就可以了。
最后
以上就是冷傲胡萝卜为你收集整理的Android 为所有app开放 系统app才能申请的权限(SD卡写权限 等。。)的全部内容,希望文章能够帮你解决Android 为所有app开放 系统app才能申请的权限(SD卡写权限 等。。)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复