How to correctly identify the file storage directory of AnkiDroid (or any other external app) from my application?

时间:2018-12-03 12:53:48

标签: android anki

I use AnkiDroid API to create and send cards to AnkiDroid application (https://github.com/ankidroid/Anki-Android/wiki/AnkiDroid-API). But there is one issue connected to sending media files via API. They are stored in the external storage, "/storage/emulated/0/AnkiDroid" in my case. I can add and read files from there, but I think this path may be different for other devices or in case if I switch to SD card. Question: how to correctly identify the path to application's external storage directory?

2 个答案:

答案 0 :(得分:1)

此处为前AnkiDroid项目维护者。

您拥有的路径是AnkiDroid媒体文件的默认路径。

您可能知道,AnkiDroid用户可以通过配置修改此路径:

enter image description here

此设置是使用Android的常规设置存储技术存储的,出于安全原因,其他应用程序无法访问该技术。

我认为该媒体资源当前未公开给其他应用(source code),但这是一个有效的用例,因此请在https://github.com/ankidroid/Anki-Android/issues创建一个新问题

同时,为了与AnkiDroid的当前版本和先前版本兼容,我想说您有两种选择:

  • 扫描SD卡以查找称为collection.media的文件。此文件夹位于AnkiDroid文件夹中,根据约定,不能更改其名称。如果发现多个,请比较上次修改日期并询问用户。
  • 具有与上述屏幕截图类似的设置。想要使用非默认文件夹的用户将不得不在两个应用程序中都进行设置,这虽然有点不方便,但并不是一件疯狂的事情。

答案 1 :(得分:0)

注意硬编码!!! 我知道这不是最好的方法。 但这对我有用。

public ArrayList getExternalFolderPath(String folderName){

    ArrayList<String> arrayList = new ArrayList<>();

    //get all storages in phone
    File externalStorages[] = getExternalFilesDirs(null);

    for (File es: externalStorages){
        String exF = es.toString();

        //cut out what don't need
        exF = exF.split("/Android/data")[0];

        File file = new File(exF);
        File[] files = file.listFiles();
        for (File f: files){
            Log.i(TAG, "getAnkiExternalFolder()" + f.toString());
            //add in array the path
            if(f.toString().contains(folderName)){
                arrayList.add(f.toString());
            }
        }
    }
    return arrayList;
}

还需要添加一个清单条目。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

并要求用户访问以读取API级别是否提高23: https://developer.android.com/training/permissions/requesting