java - 强制访问外部可移动 microSD 卡

标签 java android android-sdcard android-external-storage

我使用的是三星 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 卡进行读写访问?

注意事项:

  1. Environment.getExternalStorageDirectory().toString()给出 /storage/emulated/0这是我的手机内部存储,即不是我想要的。

  2. getExternalFilesDir(null)给出 /storage/emulated/0/Android/data/com.blahblah.appname/files/即不是我想要的。请注意,我不能使用 getExternalFilesDirs最后一个 s因为这在 API16 中不可用。此外,运行时权限在 API16 中也不可用。

  3. 我已经有了 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> , 还有 READ_EXTERNAL_STORAGE .

  4. 我阅读了很多主题,例如 this onethis one ,实际上大概有二十个类似的问题,但最后看起来很复杂,一切都和它相反。这就是我正在寻找针对这种情况的解决方案。

  5. 我不想ACTION_OPEN_DOCUMENTACTION_CREATE_DOCUMENT ,事实上我不想要任何 GUI 解决方案。

  6. 我的一些应用程序 (Sync Resilio) 被允许修改 /mnt/extSdCard/music/成功,在那里创建新文件等。

  7. 顺便说一句,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 卡作为第二目录:

introducir la descripción de la imagen aquí

但是您可以使用一种方法来获取可移动 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:

enter image description here

关于java - 强制访问外部可移动 microSD 卡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47734937/

相关文章:

java - Jython:将脚本中的java类实例化为Java对象,而不是Python对象

java - 无法解决 xml 布局中的符号错误(Udacity Sunshine 第 2 课)

java - 静态嵌套类如何拥有this指针

java - 将文件保存到外部存储时出现 NullPointerException(在一部手机上,但不在其他手机上)

java - getExternalStorageDirectory() 已弃用

java - 如何在Kotlin中将泛型类映射到相同类的泛型数组

android - 从堆栈中弹出多个 fragment

android - Alert Dialog.builder object.create() vs object.show() vs obj.create().show() 之间的区别

Android :-Switch button in RecyclerView. 适配器 OnCheckChangeListener

android - 从android中的sdcard读取特定文件