查看外部 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/
并将冒号替换为正斜杠.
我已经用很多设备(甚至是模拟器)对其进行了测试,并且运行良好。
我正在尝试在 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/
并将冒号替换为正斜杠.
我已经用很多设备(甚至是模拟器)对其进行了测试,并且运行良好。