强制访问外部可移动microSD卡

Bas*_*asj 12 java android android-sdcard android-external-storage

我正在使用三星A3,Android 5.0.2.我正在使用此设置来编译应用程序,即Android 4.1 Jelly Bean(API 16)目标.

我确切地知道了外部可移动microSD卡的路径/mnt/extSdCard/(参见下面的注释#7).

问题:我注意到了

File myDir = new File("/mnt/extSdCard/test");
myDir.mkdirs();
Run Code Online (Sandbox Code Playgroud)

不起作用:没有创建目录.

也:

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);
Run Code Online (Sandbox Code Playgroud)

产生此错误:

java.io.FileNotFoundException:/mnt/extSdCard/books/test.txt:open failed:libcore.io.IoBridge.open中的EACCES(权限被拒绝)(...

如何强制读取+写入外部可移动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. 我读了很多喜欢的话题这一个这一个,其实大概20类似的问题,但最后似乎很复杂,一切都和它的相反之说.那是我的我正在寻找特定于这种情况的解决方案.

  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
    
    Run Code Online (Sandbox Code Playgroud)

Jor*_*sys 1

请记住,某些 Android 设备的 SD 卡路径不同,有些设备没有\xc2\xb4t 有可移动 SD 卡。

\n\n

你不必\xc2\xb4t直接设置路径!

\n\n
File myDir = new File("/mnt/extSdCard/test");\nmyDir.mkdirs();\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以先检查您的设备是否安装了可移动SD卡:

\n\n
public static boolean isSDCardAvailable(Context context) {\n    File[] storages = ContextCompat.getExternalFilesDirs(context, null);\n    if (storages.length > 1 && storages[0] != null && storages[1] != null)\n        return true;\n    else\n        return false;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么外部目录 > 1,因为大多数 Android 设备都将外部存储作为主目录,将可移动 SD 卡作为第二目录:

\n\n

介绍 aqu\xc3\xad 图像的描述\xc3\xb3n

\n\n

但您可以使用一种方法来获取可移动 microSD 卡的真实路径:

\n\n
public static String getRemovableSDCardPath(Context context) {\n    File[] storages = ContextCompat.getExternalFilesDirs(context, null);\n    if (storages.length > 1 && storages[0] != null && storages[1] != null)\n        return storages[1].toString();\n    else\n        return "";\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后就这样做:

\n\n
File myDir = new File(getRemovableSDCardPath(getApplicationContext()),"test");\nif(myDir.mkdirs()){\n  Log.i(TAG, "Directory was succesfully create!");\n}else{\n  Log.i(TAG, "Error creating directory!");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

例如使用该方法:

\n\n
   String pathSDCard = getRemovableSDCardPath(getApplicationContext());\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,我得到了可移动 SD 卡的路径(如果我\xc2\xb4t 有可移动 SD 卡,我的路径将为“”,因此您可以实施验证以避免创建文件夹):

\n\n
/storage/extSdCard/Android/data/com.jorgesys.myapplication/files\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在在里面创建一个新文件夹:

\n\n
    File myDir = new File(getRemovableSDCardPath(getApplicationContext()),"test");\n    if(myDir.mkdirs()){\n        Log.i(TAG, "Directory was succesfully create!");\n    }else{\n        Log.i(TAG, "Error creating directory!");\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我已经创建了目录/test

\n\n

在此输入图像描述

\n


归档时间:

查看次数:

1514 次

最近记录:

7 年,12 月 前