① Android 6.0 读写SD卡权限问题
Android 6.0 下默认存储SD卡,使用原生FMRadio生成的文件保存到内部存储中 【预置条件】插入T卡【操作步骤】设置>存储设备和USB>选择SD卡为默认存储>收音机录音【实际结果】收音机的录音文件未保存到T卡【预期结果】收音机的录音文件保存到T卡【复现概率】10/10 此外,SoundRecorder默认存储SD卡,生成的文件却可以保存到SD卡中
1、收音机文件没有保存到指定的SD卡目录下,因此可能是文件的路径不对。 2、进入设置中,切换默认存储位置,内部存储或者SD卡,每次切换都会修改系统中某一属性值。 3、当收音机文件保存的时候,必须要读取当前系统的默认存储路径,然后生成自己的文件路径。
STEP1、初步解决方案,但没有生效,引入新问题 对比 SoundRecorder ,根据GIT库中,之前的同事的修改记录,找到可能的解决方案,修改如下:
引入新的问题,此时,点击 Start Recording 会提示内部错误。 分析Log发现,由于权限拒绝,抛出IO异常 01-01 07:35:38.167 7467 7467 W System.err: java.io .IOException: open failed: EACCES (Permission denied)
STEP2、Android M 下SD卡读写权限问题 分析由于权限问题后,结合Android M new design,开始查找文档,寻找解决Android M 下SD卡读写权限问题 Android6.0中的运行时请求权限 后来,试了好几种方法,但都没有用,以及报问题“EACCES (Permission denied)”
STEP3、再分析可能是运行时权限问题 判断APP运行时权限如下:
发现此时,FMRadio对于的组权限如下: com.android.fmradio Groups: 1013 3002 3003 9997 50010 com.android.soundrecorder Groups: 1015 1023 3003 9997 50105
根据 系统权限 的定义,有兴趣的同学可以去看一下这个文件 system/core/include/private/android_filesystem_config.h 分析这些Gid发现: 1015 为sdcard_rw,1023 为media_rw权限 因此,得出结论如下 1、首先修改AndroidManifest.xml文件,新增权限,确保FMRadio应用级的权限; 2、原生FMRadio使用过程中,会进行运行时的权限检查,故FMRadio运行时应该拿到了WRITE_EXTERNAL_STORAGE,以及READ_EXTERNAL_STORAGE权限, 3、但是由于FMRadio本身不具备“1015,1023”组权限,这些权限无效,仍然无法对SD卡进行读写操作。
STEP4、最终解决方案 在 STEP1 的修改基础上,在框架层,权限对应组中给予FMRadio相应的组权限,新增修改如下: frameworks/base/data/etc/platform.xml
重编framework.jar, 将修改后的jar文件push到手机,重启 此时,再检查FMRadio对于的组权限如下: com.android.fmradio Groups: 1013** 1015 1023** 3002 3003 9997 50010
到此为止,
② Android动态获取权限,Android 10 读取本地文件权限解决方案
在BaseActivity里写授权申请,首先检查申请的权限是不是被授权了,如果不是就加入待授权数组里,去申请权限。如果全部已授权,就直接回掉授权成功。 然后重写授权返回方法。系统会返回2个数组, String[] permissions是你申请的权限,int[] grantResults是授权结果。拿出授权结果比对,如果授权,加入授权数组,如果拒绝,加入拒绝数组。回掉给注册PermissionListener的activity 解决办法:
③ Android 内部存储/外部存储 及 读写权限
Android 使用 VFS (Virtual File System) 虚拟文件系统。VFS提供了供存储设备挂载的节点,同一存储设备经过分区后,不同的分区可以挂载到不同的节点上,如手机的内置存储卡。
内置存储卡 / 外置SD卡 内部存储 / 外部存储
VFS 的目录以 / 为根节点,根节点下面又有不同的节点。物理存储设备就是挂载到这些节点上。
内部存储卡/外置SD卡 ≠ 内部存储/外部存储
首先明确, 内置存储卡/外置SD卡 是在 物理层面 相对于 手机大众用户 来说的。 外置SD卡:可手动插拔的SD卡。 内置存储卡:焊接在手机内部不可拆卸的存储卡。
而, 内部存 /外部存储 是在 文件系统逻辑层面 相对于 开发者 来说的,指具体的路径。 一般针对某个应用而言的,属于该应用的存储路径叫内部存储,反之为外部存储。
路径: /data/data/package_name
/data/data/ 下都是已安装应用的目录,该目录下包含的文件都是以包名作为文件名的目录,例如 /data/data/com.sankuai.meituan
获取内部存储的方式如下:
其中,参数 mode 指创建模式,一种 4 种
注意: Android 7.0 以上 android.os.Build.VERSION.SDK_INT>=Build.VERSION_CODES.N 使用3/4 常量时,将会导致SecurityException,这意味着 不能通过名称共享私有文件 。 尝试共享 file://URI URI将会导致FileUriExposedException,StrictMode API政策禁止在您的应用外部公开file://URL。如果您的应用需要与其他应用共享私有文件,则可以使用 FileProvider 与 FLAG_GRANT_READ_URI_PERMISSION 配合使用。 Android 7.0 行为变更 通过FileProvider在应用间共享文件吧
外部存储,可以是 外置SD卡 或 内置存储卡的部分分区。
外部存储,分为 公共目录 和 私有目录
获取方式
检查可用性的方法:
Android 4.3 以下,只能通过 Context#getExternalFilesDir(type) 来获取外部存储在内置存储卡分区的私有目录,无法获取外置SD卡。
Android 4.3 开始,可以通过 Context#getExternalFilesDirs(type) 获取一个File数组,包含了内置存储卡分区和外置SD的私有目录地址。
可以使用兼容库的静态方法 ContextCompate.getExternalFilesDirs() 兼容 4.3。
感谢以下文章作者 解析Android内部存储、外部存储的区别
④ android P系统WRITE_MEDIA_STORAGE添加读写SD卡权限
由于android P 版本google把android.Permission.WRITE_MEDIA_STORAGE中sd卡的读写权限移除了,导致系统文件管理中的文件无法直接复制到SD卡,所以需要把SD卡的读写权限加上到WRITE_MEDIA_STORAGE权限中去, 方法一、 1、frameworks\base\data\etc\platform.xml中添加: 2、frameworks\base\services\core\java\com\android\server\pm\PackageManagerService.java 方法二、修改system\vold\model\PublicVolume.cpp 参考: https://blog.csdn.net/ch853199769/article/details/88052886 https://blog.csdn.net/qq_27061049/article/details/93715885
⑤ android 读写文件需要哪些权限
<!–往sdcard中写入数据的权限 –><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission><!–在sdcard中创建/删除文件的权限 –><uses-permission android:name="android.permission.MOUNT_U
android中的apk必须签名
这种签名不是基于权版威证书权的,不会决定某个应用允不允许安装,而是一种自签名证书。
重要的是,android系统有的权限是基于签名的。比如:system等级的权限有专门对应的签名,签名不对,权限也就获取不到。默认生成的APK文件是debug签名的。
获取system权限时用到的签名,见:如何使Android应用程序获取系统权限。基于UserID的进程级别的安全机。这种签名不是基于权威证书的,不会决定某个应用允不允许安装,而是一种自签名证书。重要的是,android系统有的权限是基于签名的。
⑥ 【Android笔记】Android 9.0 SD卡读写权限问题
Android 9.0 SD卡权限管理更为严格,在项目测试中遇到以下问题: [步骤] 1.在图库中删除T卡上的图片或者视频,在文件管理中查看还存在 2.在视频应用中删除视频情况一样 [备注]重启手机后,再次进入图库重新加载进来 跟踪调试发现,是SD卡写权限被禁,用户无法对SD卡内容进行操作。 原文分析 https://blog.csdn.net/shift_wwx/article/details/85633801 修改方法: 增加-w 权限,下面第二个加上去的。 alps_p0_mp2\update\alps\system\vold\model\PublicVolume.cpp if (!(mFusePid = fork())) { if (getMountFlags() & MountFlags::kPrimary) { if (execl(kFusePath, kFusePath, "-u", "1023", // AID_MEDIA_RW "-g", "1023", // AID_MEDIA_RW "-U", std::to_string(getMountUserId()).c_str(), "-w", mRawPath.c_str(), stableName.c_str(), NULL)) { PLOG(ERROR) << "Failed to exec"; } } else { if (execl(kFusePath, kFusePath, "-u", "1023", // AID_MEDIA_RW "-g", "1023", // AID_MEDIA_RW "-U", std::to_string(getMountUserId()).c_str(), "-w",//add by for add sdcard permission 就是这样 mRawPath.c_str(), stableName.c_str(), NULL)) { PLOG(ERROR) << "Failed to exec"; } } 这样操作之后SD卡就有了写权限,用户可以对SD卡中数据进行操作。
⑦ android怎么在代码里获得系统文件的读写权限
本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的。第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。第二个办法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:1. 同上,加入android:sharedUserId="android.uid.system"这个属性。2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build argetproctsecurity",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build oolssignapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。这样最后得到的apk和第一个方法是一样的。最后解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platformkey,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到 platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android 中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package … has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。
⑧ Android申请了读写权限依旧无法创建文件夹
1.首先要保证在清单文件中注册读写权限:2.如果是安卓6.0及以上的api,需要动态申请读写权限 3.如果是api >= 29,需要在清单文件中增加如下配置
⑨ Android10读写文件权限请求bug——open failed: EACCES (Permission denied)
在AndroidManifest.xml中声明了 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ,却还是报错open failed: EACCES (Permission denied)。 问题的原因在于比如在安卓Q(10)开始,就采用存储的分区控制。 解决方法:只能通过手动打开权限,才能使用存储权限。 在AndroidManifest.xml的application标签下新增 android:requestLegacyExternalStorage="true" 即可解决
⑩ android 怎么读写权限设置
在AndroidManifest.xml文件中添加一条写内存卡的权限即可专<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>读的权限是默认属有的无需添加</a>