查看外部 SD 卡上文件夹的更改

Watching a folder for changes on external SD card

我正在尝试在 Android Api 26+ 上监听外部 SD 卡上的文件夹更改,问题是我没有得到真正的路径,我只得到了内容网址。 我几乎什么都试过了:

1- 第三方库。

2- Environment.getExternalStorageDirectory();

3- System.getenv("SECONDARY_STORAGE")

4- System.getenv("EXTERNAL_STORAGE")

5- Environment.getExternalStoragePublicDirectory();

我无法访问外部 SD 卡,我需要一个真实的路径来添加到 FileObserver。 对如何听SD卡上的文件夹,或者如何获取它的路径有什么建议吗?

所以经过调试,我找到了获取picked文件夹路径的方法

首先,我使用文档树构建 uri

Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri,
                DocumentsContract.getTreeDocumentId(uri));

并对其执行查询

cursor = context.getContentResolver().query(contentUri,  null, null, null, null);

并获取 document_id 列中的数据

String string = cursor.getString(cursor.getColumnIndex("document_id"));

如果它在 sd 卡中,它将类似于 XXX-XXX:DCIM/ffmpeg,如果它在内部存储中,它将类似于 primary:DCIM/ffmpeg

最后,我通过这个得到了真正的路径:

String[] strings = string.split(":");
            String newPath = "/storage/" +
                    (strings[0].equals("primary")?"emulated/0/"+strings[1]:
                            string.replaceAll(":", "/"));

这会将列中的数据分成两部分(我对第一个字符串感兴趣只是想知道它是否在 sd 卡中)。如果它在 sd 卡中,它将添加一个前缀 /storage/ 并将所有冒号替换为正斜杠,如果它在主存储中,它将添加一个前缀 /storage/emulated/0/ 并将冒号替换为正斜杠.

我已经用很多设备(甚至是模拟器)对其进行了测试,并且运行良好。