好像是Android版本升級了,原始碼修改了
示例代碼
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Media.DATA,
MediaStore.Images.ImageColumns.BUCKET_ID,
MediaStore.Images.Media.DATE_MODIFIED
// "COUNT(*) AS IMAGES_COUNT"
},
MediaStore.Images.Media.MIME_TYPE + "=? or " +
MediaStore.Images.Media.MIME_TYPE + "=? or " +
MediaStore.Images.Media.MIME_TYPE + "=? or " +
MediaStore.Images.Media.MIME_TYPE + "=?) "
+ "group by (" + MediaStore.Images.ImageColumns.BUCKET_ID ,
new String[]{"image/jpeg", "image/png", "image/jpg", "image/gif"},
MediaStore.Images.Media.DATE_MODIFIED + " asc"
//MediaStore.Images.Media.DATE_MODIFIED + " asc)" (夜神測驗運行時最后面加一個括號)
);
問題詳情
夜神Android5.1
前面的代碼塊在夜神模擬器上運行是沒有問題的,我故意在最后面多添加一個括號,報了語法錯誤,下面是報錯資訊列印的查詢陳述句
SELECT _data, bucket_id, date_modified
FROM images
WHERE (mime_type=? or mime_type=? or mime_type=? or mime_type=?)
group by (bucket_id)
ORDER BY date_modified asc)
去掉最后面多余的")"后是正確的語法
SELECT _data, bucket_id, date_modified
FROM images
WHERE (mime_type=? or mime_type=? or mime_type=? or mime_type=?)
group by (bucket_id)
ORDER BY date_modified asc
問題來了,在小米9上運行沒有加料的代碼塊,直接報錯了
下面是報錯列印的查詢陳述句,多加了幾個AND,還把group by也括進去了
SELECT _data, bucket_id, date_modified
FROM images
WHERE (
(is_pending=0)
AND (is_trashed=0)
AND (volume_name IN ( 'external_primary' ))
)
AND ((mime_type=? or mime_type=? or mime_type=? or mime_type=?) group by (bucket_id))
ORDER BY date_modified asc
差別如下
//夜神
WHERE (mime_type=? or mime_type=? or mime_type=? or mime_type=?)
group by (bucket_id)
//小米9
WHERE (
(is_pending=0)
AND (is_trashed=0)
AND (volume_name IN ( 'external_primary' ))
)
AND ((mime_type=? or mime_type=? or mime_type=? or mime_type=?) group by (bucket_id))
待解決,有沒有大佬指點一下
替代方案
不分組查詢了,查詢完之后遍歷 cursor獲取檔案夾串列的時候,加上去重操作
//獲取所有圖片集
@RequiresApi(api = Build.VERSION_CODES.Q)
private ArrayList<ImageFolder> getAlbums(Context context) {
ArrayList<ImageFolder> albums = new ArrayList<>();
albums.add(getNewestPhotos(context));
//利用ContentResolver查詢資料庫,找出所有包含圖片的檔案夾,保存到相冊串列中
ContentResolver resolver = context.getContentResolver();
Cursor cursor = resolver.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{
MediaStore.Images.Media.DATA,
MediaStore.Images.ImageColumns.BUCKET_ID,
MediaStore.Images.Media.DATE_MODIFIED},
MediaStore.Images.Media.MIME_TYPE + "=? or " +
MediaStore.Images.Media.MIME_TYPE + "=? or " +
MediaStore.Images.Media.MIME_TYPE + "=? or " +
MediaStore.Images.Media.MIME_TYPE + "=?",
new String[]{"image/jpeg", "image/png", "image/jpg", "image/gif"},
MediaStore.Images.Media.DATE_MODIFIED + " asc"
);
if (cursor != null) {
List<String> dirs = new ArrayList<>();
A:
while (cursor.moveToNext()) {
final File file = new File(cursor.getString(0));
for (String parent : dirs) {
if (parent.equalsIgnoreCase(file.getParent())) {
continue A;
}
}
ImageFolder imageFolder = new ImageFolder();
imageFolder.setDir(file.getParent());
imageFolder.setId(cursor.getString(1));
imageFolder.setFirstImagePath(cursor.getString(0));
dirs.add(file.getParent());
String[] all = file.getParentFile().list(new FilenameFilter() {
private boolean e(String filename, String ends) {
return filename.toLowerCase().endsWith(ends);
}
@Override
public boolean accept(File dir, String filename) {
return e(filename, ".png") || e(filename, ".jpg") || e(filename, "jpeg") || e(filename, ".gif");
}
});
if (all != null && all.length > 0) {
imageFolder.setCount(all.length);
albums.add(imageFolder);
}
}
Log.e("test", dirs.toString());
cursor.close();
}
return albums;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/68973.html
標籤:Android
