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