android文件读写权限|android 读写文件需要哪些权限

① 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>


赞 (0)