在API 23没有写权限,但所有所需的权限授予

问题描述:

文件:在API 23没有写权限,但所有所需的权限授予

[email protected]_x86:/storage # ls -la 1AF9-2810/ 
-rwxrwx--x root  sdcard_rw 348218 2016-08-19 17:55 2012 (1).JPG 
-rwxrwx--x root  sdcard_rw 106512 2014-12-05 19:49 2012 (2).jpg 
drwxrwx--x root  sdcard_rw   2016-08-16 19:36 Android 
drwxrwx--x root  sdcard_rw   2016-08-16 19:36 LOST.DIR 

的Android API 23个权限授予:

ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
true 
ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED 
true 

测试新文件1:KO

new File("/storage/emulated/1AF9-2810/test1").createNewFile() 
IOException - open failed: ENOENT (No such file or directory) 

测试新档案2:ko

new FileOutputStream("/storage/emulated/1AF9-2810/test2", false) 
FileNotFoundException - /storage/emulated/1AF9-2810/test2: open failed: ENOENT (No such file or directory) 

测试现有的文件:KO

new FileOutputStream("/storage/emulated/1AF9-2810/2012 (1).JPG", false) 
FileNotFoundException - /storage/emulated/1AF9-2810/2012 (1).JPG: open failed: ENOENT (No such file or directory) 

测试/存储/模拟/ 0:OK

new FileOutputStream("/storage/emulated/0/test3.JPG", false) 
FileOutputStream OK!! 

原来的谷歌Android库有写权限我的图片,并能写进去。 (见时间戳“2016-08-19 17:55 2012(1).JPG”)

有人可以解释会发生什么吗?为什么我无法写入SD卡路径/ storage/emulated/1AF9-2810?

[email protected]_x86:/storage # ls -la 
drwxrwx--x root  sdcard_rw   2016-08-19 17:55 1AF9-2810 
drwx--x--x root  sdcard_rw   2016-08-19 17:28 emulated 
drwxr-xr-x root  root    2016-08-19 17:28 self 

DF

[email protected]_x86:/storage # df 
Filesystem    Size  Used  Free Blksize 
/dev     249.6M 44.0K 249.6M 4096 
/sys/fs/cgroup   249.6M 12.0K 249.6M 4096 
/mnt     249.6M  0.0K 249.6M 4096 
/system     1.2G 861.7M 378.2M 4096 
/cache     61.0M 64.0K 60.9M 4096 
/data     1.9G 205.6M  1.7G 4096 
/storage    249.6M  0.0K 249.6M 4096 
/mnt/runtime/default/emulated  1.9G 205.6M  1.7G 4096 
/storage/emulated  1.9G 205.6M  1.7G 4096 
/mnt/runtime/read/emulated  1.9G 205.6M  1.7G 4096 
/mnt/runtime/write/emulated  1.9G 205.6M  1.7G 4096 
/mnt/media_rw/1AF9-2810 1020.0M 474.0K 1019.5M 2048 
/mnt/runtime/default/1AF9-2810 1020.0M 474.0K 1019.5M 2048 
/storage/1AF9-2810 1020.0M 474.0K 1019.5M 2048 
/mnt/runtime/read/1AF9-2810 1020.0M 474.0K 1019.5M 2048 
/mnt/runtime/write/1AF9-2810 1020.0M 474.0K 1019.5M 2048 

编辑: 有趣的讨论:http://forum.xda-developers.com/showthread.php?t=2634840&page=2

不过,这并不没有root访问权限的工作。我们需要WRITE_MEDIA_STORAGE权限,该权限仅适用于系统进程。

+0

为什么不用正确的方法使用getExternalStoragePublicDirectory(),getExternalFilesDir()或getExternalFilesDirs() – lionscribe

+0

因为我需要写入原始文件以更新exif信息。 –

+0

对'/ storage/emulated/1AF9-2010'的任何尝试都会失败,因为它是无效路径。使用'/ storage/emulated/0/test3.JPG'进行测试是可以的,因为如预期的那样,0是一个user_id(你)。 1AF9-2810是外部scdard还是USB? 你能举报'ls -la/mnt/runtime/write/1AF9-2810'并尝试在该文件夹上创建一个新文件吗? – libeasy

自Android 4.4以来,您无法写入removable storage的任意位置。您的权限为external storage,这不是可移动存储。

+0

为什么原始画廊可以写入这个文件夹?还有任何第三方文件浏览器? –

+0

@DennyWeinberg:“为什么原始画廊可以写入这个文件夹?” - 预安装的应用程序可以被ROM开发者授予额外的权利。 “还有任何第三方文件浏览器?” - 通常,它们也不能与可移动存储一起使用。 – CommonsWare

+0

那么绝对没有解决方案吗?你也许是对的。有人向我报告ES文件资源管理器可以访问这些文件。但也许只能读取访问?没有写入权限? –