需求是我将 图片拷贝到 SD卡/APictures/ 中,进入APP 的时候,能够看到该文件夹中的图片。
我这边思路是通过查询 EXTERNAL_CONTENT_URI 获取所有的图片,从而显示我拷贝到文件夹中的图片。 但是我发现我拷贝的文件并没有在结果中找到。
private List<MediaStoreData> queryImages() {
return query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, // 查询URI
IMAGE_PROJECTION,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATE_TAKEN,
MediaStore.Images.ImageColumns.DATE_MODIFIED,
MediaStore.Images.ImageColumns.MIME_TYPE,
MediaStore.Images.ImageColumns.ORIENTATION,
MediaStoreData.Type.IMAGE);
}
private List<MediaStoreData> query(
Uri contentUri,
String[] projection,
String sortByCol,
String idCol,
String dateTakenCol,
String dateModifiedCol,
String mimeTypeCol,
String orientationCol,
MediaStoreData.Type type) {
final List<MediaStoreData> data = new ArrayList<MediaStoreData>();
String selection = null;
String[] selectionArgs = null;
if (filterType == 0) {
selection = null;
selectionArgs = null;
} else if (filterType == 1) {
selection = MediaStore.Images.Media.DATA + " like ?";
String path = getDefaultPath();
selectionArgs = new String[]{path + "%"};
} else if (filterType == 2) {
selection = MediaStore.Images.Media.DATA + " not like ?";
String path = getDefaultPath();
selectionArgs = new String[]{path + "%"};
}
Cursor cursor =
getContext()
.getContentResolver()
.query(contentUri, projection, selection, selectionArgs, sortByCol + " DESC");
if (cursor == null) {
return data;
}
... 省略
}
问题是拷贝的文件必须要进行扫描后才能显示出来,方法如下:
fun scanFileDir() {
val saveAs = getDefaultDirPath() // 路径
val pathArr = arrayOf(saveAs)
val mineType = arrayOf("*/*")
MediaScannerConnection.scanFile(MyApplication.instance!!, pathArr, mineType, object :
MediaScannerConnection.MediaScannerConnectionClient {
override fun onScanCompleted(path: String?, uri: Uri?) {
Log.i(TAG, "onScanCompleted")
}
override fun onMediaScannerConnected() {
Log.i(TAG, "onMediaScannerConnected")
}
})
主要是调用 MediaScannerConnection.scanFile 进行扫描,我在每次进入应用的时候,进行一次扫描就可以在查询所有文件的时候,得到我拷贝的图片。