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

Android 查看外部SD卡上文件夹的更改,android,android-sdcard,Android,Android Sdcard,我试图在Android Api 26+上监听外部SD卡上的文件夹更改,问题是我没有得到真正的路径,我只得到了内容URI。 我几乎什么都试过了: 1-第三方库 2-Environment.getExternalStorageDirectory() 3-System.getenv(“辅助存储”) 4-System.getenv(“外部存储”) 5-Environment.getExternalStoragePublicDirectory() 我无法访问外部SD卡,我需要一个实际路径来添加到FileO

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

1-第三方库

2-Environment.getExternalStorageDirectory()

3-System.getenv(“辅助存储”)

4-System.getenv(“外部存储”)

5-Environment.getExternalStoragePublicDirectory()

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

因此,在调试之后,我找到了获取所选文件夹路径的方法

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

Uri docUri = DocumentsContract.buildDocumentUriUsingTree(uri,
                DocumentsContract.getTreeDocumentId(uri));
并对其进行了查询

cursor = context.getContentResolver().query(contentUri,  null, null, null, null);
并在
document\u 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/
,并用正斜杠替换冒号


我已经用很多设备(甚至是模拟器)测试过它,它工作得很好。

您想要的是从
content://
中获得:
path,对吗?是的,我想要一个真正的路径在FileObserver中传递它。请尝试GetExternalFileDirs()。它将返回两个项目,其中第二个项目位于SD卡上(如果有)。getExternalFilesDirs()返回SD卡中的应用程序文件夹,我要SD卡的根目录。这有什么关系?您可以删除../Android/data//files部分。那你就有根了。没有其他方法。在第一个代码块中,您有
docUri
,但在第二个代码块中,您使用
contentUri
。这些都是相同的吗?