允许用户在Android上的内部和外部存储位置之间切换

时间:2019-02-21 18:29:09

标签: android

我正在一个项目上,我需要允许用户从外部SD卡或内部存储器进行读取和写入,但是无论我尝试什么,都只能找到一个存储位置。

我正在使用Android模拟器,该模拟器具有android studio托管的SD卡和内部存储,在加载solid Explorer时显示它们可用。

我正在使用以下代码来获取存储位置:

File[] files = ContextCompat.getExternalFilesDirs(this, null);
        for (int i = 0; i < files.length; i++)
        {
            Log.d("BasePicker", "Name: " + files[i].getName() + " Path: " + files[i].getParentFile().getParentFile().getParentFile().getParentFile());
        }

以下输出以下内容:

Name: files Path: /storage/emulated/0

我正在做getPatentFile() 4次,显示每个存储位置的根,否则路径将类似于/ storage / emulated / 0 / package_name / files

然后我尝试使用以下方法获取外部存储位置:

Log.d("BasePicker", Environment.getExternalStorageDirectory().getPath());

,但是我得到的存储路径与“ / storage / emulated / 0”完全相同。

我也尝试了以下方法:

Map<String, File> storageLocations = new HashMap<>(10);
        File sdCard = Environment.getExternalStorageDirectory();
        storageLocations.put(SD_CARD, sdCard);
        final String rawSecondaryStorage = System.getenv(ENV_SECONDARY_STORAGE);
        if (!TextUtils.isEmpty(rawSecondaryStorage)) {
            String[] externalCards = rawSecondaryStorage.split(":");
            for (int i = 0; i < externalCards.length; i++) {
                String path = externalCards[i];
                storageLocations.put(EXTERNAL_SD_CARD + String.format(i == 0 ? "" : "_%d", i), new File(path));
            }
        }

但这又只返回/ storage / emulated / 0

所以问题是,如何获得内部和外部存储位置(如果可用),以便我可以允许用户选择他们要使用的存储位置,并且可以浏览和读取/写入任何位置他们想要的存储位置?

更新

我已经使用adb shell找到了从我的SD卡上的Solid Explorer中创建的文件位于/mnt/media_rw/1AF7-1E14中,但这似乎只能以root身份访问,普通用户看不到它。

1 个答案:

答案 0 :(得分:0)

您检查了此帖子吗? completely differently 根据该帖子,您正在寻找System.getenv("SECONDARY_STORAGE")

如果这不起作用,我会在/ storage中获得目录列表,模拟为您的内部存储,另一个文件夹应为SD卡。