Android6以后第三方APP获取读写外部SD卡权限的方法

分析过程:
android6以前,想让第三方APP获的读写外部SD卡的权限,只要修改
frameworks/base/data/etc/platform.xml

   
       
       
   


改为

   
       
       
       
   
   
     
即可,但是,安卓6以后能这么改无效,看注释:

         
好像跟这个packages.xml文件有关,在安卓开发板的串口下执行命令看看,
find . -name packages.xml
发现这个文件在./data/system/packages.xml

打开改文件看看,


   
   
   
       
   

   
       
       
       
       
       
       
       
       
       
。。。。。。

一堆东西,百度了一下这个文件是管理所有apk包的信息的,
想起系统自带的FileBrowser APP是有读写外部SD卡的权限的,那么在packages.xml搜索一下这个apk的信息看看,
   
       
           
       

       
           
           
           
       

       
   

    
发现它用的是android.permission.WRITE_MEDIA_STORAGE这个权限,那是不是用这个权限就可以了呢?
我这这个packages.xml里搜索了自己的apk,加上这个权限,还真就可以读写外部sd卡了,
但是,只要重新安装app,这个文件就被刷新了,所以你又得手动修改,如果用这种方法这不把人逼疯了吗!
有点思路了,但是你总不能要求用户也这么干吧?这样谁还用你的产品啊?


所以,百度一下是谁创建和管理这个packages.xml文件呢?
百度的结果是PackageManagerService这个服务,那么搜索framework一下这个文件在哪里?
结果是frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
打开来看,21223行代码,就问你怕不怕!
怕也得干啊,我的想法是,写这个代码的人再牛逼他开发的时候总得打印一些东西来调试吧?所以不管三七二十一,将
这个文件所有打印的开关全部打开,然后再安装一下apk,看看打印什么内容,再根据打印的顺序和内容分析,
具体的分析过程太多就不写了(我是解决问题半年后才写的这个笔记),这里直接给出最终的答案,

解决方法
将grantPermissionsLPw函数的
case PermissionInfo.PROTECTION_SIGNATURE: {
里的
if (allowedSig)

改为
if (allowedSig || perm.equals("android.permission.MOUNT_UNMOUNT_FILESYSTEMS")
                     || perm.equals("android.permission.WRITE_MEDIA_STORAGE"))

我这个是将android.permission.WRITE_MEDIA_STORAGE和android.permission.MOUNT_UNMOUNT_FILESYSTEMS权限完全开放了,
谁申请都得,如果只想自己的app才能申请的话,只要将其改成
if (allowedSig || pkg.packageName.equals(你APP包名))
即可。

然后apk就用动态申请权限的方法去申请android.permission.WRITE_MEDIA_STORAGE权限即可。


如果您感觉本篇博客对您有帮助,请打开支付宝,领个红包支持一下,祝您扫到99元,谢谢~~

你可能感兴趣的:(Android)