我使用的是三星 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 解决方案。我的一些应用程序 (Sync 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
最佳答案
请记住,有些安卓设备的 SD 卡路径不同,有些则没有可移动的 SD 卡。
您不必直接设置路径!
File myDir = new File("/mnt/extSdCard/test");
myDir.mkdirs();
您可以先查看您的设备是否挂载了可移动的SD卡:
public static boolean isSDCardAvailable(Context context) {
File[] storages = ContextCompat.getExternalFilesDirs(context, null);
if (storages.length > 1 && storages[0] != null && storages[1] != null)
return true;
else
return false;
}
为什么要获取外部目录 > 1,因为大多数 android 设备都将外部存储作为主目录,将可移动 SD 卡作为第二目录:
但是您可以使用一种方法来获取可移动 microSD 卡的真实路径:
public static String getRemovableSDCardPath(Context context) {
File[] storages = ContextCompat.getExternalFilesDirs(context, null);
if (storages.length > 1 && storages[0] != null && storages[1] != null)
return storages[1].toString();
else
return "";
}
然后就这样做:
File myDir = new File(getRemovableSDCardPath(getApplicationContext()),"test");
if(myDir.mkdirs()){
Log.i(TAG, "Directory was succesfully create!");
}else{
Log.i(TAG, "Error creating directory!");
}
例如使用方法:
String pathSDCard = getRemovableSDCardPath(getApplicationContext());
结果是我的可移动 SD 卡的路径(如果我没有可移动 SD 卡,我的路径将是“”,因此您可以实现验证以避免创建文件夹):
/storage/extSdCard/Android/data/com.jorgesys.myapplication/files
现在在里面创建一个新文件夹:
File myDir = new File(getRemovableSDCardPath(getApplicationContext()),"test");
if(myDir.mkdirs()){
Log.i(TAG, "Directory was succesfully create!");
}else{
Log.i(TAG, "Error creating directory!");
}
现在我创建了目录/test
:
关于java - 强制访问外部可移动 microSD 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47734937/