2

我使用 AnkiDroid API 创建卡片并将卡片发送到 AnkiDroid 应用程序(https://github.com/ankidroid/Anki-Android/wiki/AnkiDroid-API)。但是有一个问题与通过 API 发送媒体文件有关。它们存储在外部存储中,在我的例子中是“/storage/emulated/0/AnkiDroid”。我可以从那里添加和读取文件,但我认为其他设备的路径可能不同,或者如果我切换到 SD 卡。问题:如何正确识别应用程序外部存储目录的路径?

4

2 回答 2

1

前 AnkiDroid 项目维护者在这里。

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

AnkiDroid 用户可以通过配置修改这个路径,你可能知道:

在此处输入图像描述

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

我不认为该属性当前暴露给其他应用程序(源代码),但这是一个有效的用例,所以请在https://github.com/ankidroid/Anki-Android/issues创建一个新问题

同时,为了与当前和以前版本的 AnkiDroid 兼容,我会说你有两个选择:

  • 扫描 SD 卡寻找一个叫collection.media. 此文件夹位于 AnkiDroid 文件夹内,按照惯例,它的名称不能更改。如果你找到几个,比较最后修改日期并询问用户。
  • 设置类似于上面屏幕截图中的设置。想要使用非默认文件夹的用户必须在两个应用程序中都设置它,这有点不方便,但并不是一件疯狂的事情。
于 2018-12-04T08:19:13.840 回答
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

于 2018-12-06T12:41:24.463 回答