【发布时间】:2018-05-23 21:56:27
【问题描述】:
我使用的是三星 A3,Android 5.0.2。我正在使用 this setup 编译应用程序,即 Android 4.1 Jelly Bean (API 16) 目标。
我确切地知道外部可移动 microSD 卡的路径,它是/mnt/extSdCard/(另请参阅下面的注释 #7)。
问题:我注意到了
File myDir = new File("/mnt/extSdCard/test");
myDir.mkdirs();
不起作用:没有创建目录。
还有:
File file = new File("/mnt/extSdCard/books/test.txt"); // the folder "books" already exists on the external microSD card, has been created from computer with USB connection
FileOutputStream fos = new FileOutputStream(file);
产生这个错误:
java.io.FileNotFoundException: /mnt/extSdCard/books/test.txt: open failed: EACCES (Permission denied) at libcore.io.IoBridge.open(...
如何强制对外部可移动 microSD 卡进行读写访问?
注意事项:
Environment.getExternalStorageDirectory().toString()提供/storage/emulated/0这是我的手机内部存储,即不是我想要的。getExternalFilesDir(null)给出/storage/emulated/0/Android/data/com.blahblah.appname/files/即不是我想要的。请注意,我不能将getExternalFilesDirs与最终的s一起使用,因为这在API16 中不可用。 API16 中也没有运行时权限。我已经有
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,还有READ_EXTERNAL_STORAGE。我读了很多诸如this one或this one之类的主题,实际上可能有二十个类似的问题,但最后看起来很复杂,一切都说反了。这就是我正在寻找针对这种情况的解决方案。
我不想要
ACTION_OPEN_DOCUMENT和ACTION_CREATE_DOCUMENT,实际上我不想要任何GUI解决方案。我拥有的一些应用程序(同步 Resilio)可以成功修改
/mnt/extSdCard/music/,在那里创建新文件等。-
顺便
ls -la /mnt/extSdCard/给了drwxrwx--x root sdcard_r 2017-10-15 01:21 Android drwxrwx--- root sdcard_r 2017-10-14 00:59 LOST.DIR drwxrwx--- root sdcard_r 2017-12-05 16:44 books drwxrwx--- root sdcard_r 2017-11-21 22:55 music
【问题讨论】:
-
你忘了提到运行时权限。
-
看看 getExternalFilesDirs()。如果幸运的话,它会返回两条路径。然后第二个将是 micro SD 卡上的可写。
-
你可以用谷歌搜索运行时权限。但是对于访问 micro SD 卡,它们是没有用的。
-
@greenapps 在 API16 中,带有复数 (Dirs) 的
getExternalFilesDirs不可用。运行时权限也不可用,请参见注释 2。还有其他想法吗? -
您需要使用
DocumentFile。没有公共 API 可以获取可移动 SD 卡的路径(据我所知)。这应该会有所帮助:stackoverflow.com/a/35175460/1048340 为什么不能使用内部存储来代替可移动 SD 卡?
标签: java android android-sdcard android-external-storage