在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包名))
这样就可以了。

更多相关文章

  1. Android(安卓)数据Parcel序列化过程源码分析
  2. 浅谈Android系统开发中LOG的使用
  3. 免root实现 Android改机(一键新机)技术解密。
  4. Android(安卓)和 target 分析
  5. Android(安卓)SimpleAdapter源码详解
  6. Android(安卓)5.1 AOSP 源码获取
  7. Android(安卓)事件分发源码分析
  8. Android(安卓)系统架构
  9. androidP 系统集成时发现部分应用初次打开时提示此应用专为低版

随机推荐

  1. Bitmap,byte流,drawable之相互转换
  2. Android(安卓)Lint
  3. Android(安卓)中传递 json 的问题
  4. Android(安卓)MediaScannerConnection,And
  5. Android(安卓)– 切换夜间模式
  6. Android(安卓)API 中文 (51) —— ZoomButt
  7. 曾经的笔记——android的学习笔记(广播接
  8. AndroidStudio快捷键整理--5
  9. 《Android系统安全和反编译实战》目录
  10. 23. android dialog——自定义对话框之三