接受的答案让我开始思考这个问题,但其中包含了一些小错误。
case LEFT:
// handle case where a row in cursorA is unique
// images is unique (missing thumbnail)
case RIGHT:
// handle case where a row in cursorB is unique
// thumbs is unique (missing image)
这些是反过来的。文档自相矛盾,很可能是错误发生的地方。从CursorJoiner源代码中:
case LEFT:
// handle case where a row in cursorA is unique
在源代码中的Result枚举中,然后返回翻译的文本:
public enum Result {
RIGHT,
LEFT,
BOTH
}
所以我猜这就是你强制递增游标的原因。
//compensate for CursorJoiner expecting cursors ordered ascending...
c_images.moveToNext()
c_thumbs.moveToPrevious()
CursorJoiner中的迭代器会自动为您递增游标。
以下是应该工作的代码(此代码还将内部存储和外部存储合并为一个游标):
Cursor[] thumbs = new Cursor[2];
thumbs[0] = mActivity.getContentResolver().query(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Thumbnails._ID ,
MediaStore.Images.Thumbnails.IMAGE_ID,
MediaStore.Images.Thumbnails.DATA
},
null,
null,
MediaStore.Images.Thumbnails.IMAGE_ID + "*(-1)"
);
thumbs[1] = mActivity.getContentResolver().query(
MediaStore.Images.Thumbnails.INTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Thumbnails._ID ,
MediaStore.Images.Thumbnails.IMAGE_ID,
MediaStore.Images.Thumbnails.DATA
},
null,
null,
MediaStore.Images.Thumbnails.IMAGE_ID + "*(-1)"
);
Cursor thumbCursor = new MergeCursor(thumbs);
Cursor[] cursors = new Cursor[2];
cursors[0] = mActivity.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.MIME_TYPE
},
null,
null,
MediaStore.Images.Media._ID + "*(-1)"
);
cursors[1] = mActivity.getContentResolver().query(
MediaStore.Images.Media.INTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.MIME_TYPE
},
null,
null,
MediaStore.Images.Media._ID + "*(-1)"
);
Cursor photoCursor = new MergeCursor(cursors);
CursorJoiner cursorJoiner = new CursorJoiner(
thumbCursor,
new String[]{
MediaStore.Images.Thumbnails.IMAGE_ID
},
photoCursor,
new String[]{
MediaStore.Images.Media._ID,
}
);
Cursor finalCursor= new MatrixCursor(new String[]{
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.ORIENTATION,
MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
MediaStore.Images.Media.BUCKET_ID,
MediaStore.Images.Media.MIME_TYPE,
"thumb_data"
});
for (CursorJoiner.Result joinerResult : cursorJoiner) {
switch (joinerResult) {
case RIGHT:
finalCursor.addRow(new Object[]{
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media._ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.DATA)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE)),
null
});
break;
case BOTH:
finalCursor.addRow(new Object[]{
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media._ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.DATA)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME)),
photoCursor.getLong(photoCursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID)),
photoCursor.getString(photoCursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE)),
thumbCursor.getString(thumbCursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA)),
});
break;
}
}
photoCursor.close();
thumbCursor.close();