【问题标题】:How can I get only jpg or png images from cursor如何从光标中仅获取 jpg 或 png 图像
【发布时间】:2021-02-13 00:23:54
【问题描述】:

我只想要带有光标特定扩展名的图像。 如果我像这样写一个游标查询,那么它将给我最后添加的图像。 例如,如果我使用 jpg 图像,那么它将提供 .jpg 图像路径。 如果我添加 .png 扩展名,那么它将提供一个 .png 图像路径

Cursor cur = getContentResolver().query(Images, PROJECTION_BUCKET, "1) GROUP BY 1,(2", null,
                "MAX(datetaken) DESC");

但是如何从光标获取图像文件的特定扩展名。 我已经尝试过这段代码,但给了我一个错误:

String[] PROJECTION_BUCKET = new String[] { "bucket_id", "bucket_display_name", "datetaken", "_data" };
Uri Images = Media.EXTERNAL_CONTENT_URI;


String where = MediaStore.Images.Media.MIME_TYPE + "='image/jpeg'" +
                " OR " + MediaStore.Images.Media.MIME_TYPE + "='image/png’"+
                        " OR " + MediaStore.Images.Media.MIME_TYPE + "='image/jpg’";


Cursor cur = getContentResolver().query(Images, PROJECTION_BUCKET where,null,MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC");

错误:

11-06 18:15:10.249: E/SQLiteLog(3167): (1) near "image": syntax error
11-06 18:15:10.249: E/DatabaseUtils(3167): Writing exception to parcel
11-06 18:15:10.249: E/DatabaseUtils(3167): android.database.sqlite.SQLiteException: near "image": syntax error (code 1): , while compiling: SELECT bucket_id, bucket_display_name, datetaken, _data FROM images WHERE (mime_type='image/jpeg' OR mime_type='image/png’ OR mime_type='image/jpg’) ORDER BY datetaken DESC
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:400)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:333)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at com.android.providers.media.MediaProvider.query(MediaProvider.java:2700)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.content.ContentProvider.query(ContentProvider.java:1010)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.content.ContentProvider$Transport.query(ContentProvider.java:214)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
11-06 18:15:10.249: E/DatabaseUtils(3167):  at android.os.Binder.execTransact(Binder.java:446)

有人知道如何为此编写查询吗?

【问题讨论】:

  • How can I get only jpg or png images from cursor。从光标?我以为你在查询 MediaStore。

标签: android image cursor


【解决方案1】:

正确的查询在下面我找到了我自己的问题的解决方案

String where = MediaStore.Images.Media.MIME_TYPE + "='image/jpeg'" + " OR " + MediaStore.Images.Media.MIME_TYPE + "='image/png'"+ " OR " + MediaStore.Images.Media.MIME_TYPE + "='image/jpg'";

我在问题代码中只犯了一个错误,错误是我在“png”和“jpg”的末尾写了'this,我只是将'this替换为'就是这样

【讨论】:

  • 好的,我的答案可以运行,你测试了吗?
  • 不,你的答案对我不起作用,我得到了我自己的问题解决方案,我还在评论中发布了正确的查询,感谢@propoLis的帮助
【解决方案2】:

对于仍在研究此问题的任何人,以下是解决方案:

private String[] thumbColumns = {MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails.IMAGE_ID};
private String[] columns = {MediaStore.Images.Media._ID, MediaStore.Images.Media.DATA, MediaStore.Images.Media.DATE_TAKEN};
private String[] whereArgs = {"image/jpeg", "image/png", "image/jpg"};

String orderBy = MediaStore.Images.Media.DATE_TAKEN+ " DESC";
String  where = MediaStore.Images.Media.MIME_TYPE + "=? or "
                + MediaStore.Images.Media.MIME_TYPE + "=? or "
                + MediaStore.Images.Media.MIME_TYPE + "=?";

Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, where, whereArgs, orderBy);

【讨论】:

    【解决方案3】:
     private fun getLocalPhotos(contentResolver: ContentResolver): ArrayList<Uri> {
        val projection = arrayOf(MediaStore.Images.Media._ID)
        val selection = (MediaStore.Images.Media.MIME_TYPE + "=? or "
                + MediaStore.Images.Media.MIME_TYPE + "=? or "
                + MediaStore.Images.Media.MIME_TYPE + "=?")
        val selectionArgs = arrayOf("image/jpeg", "image/png", "image/jpg")
        val sortOrder = "${MediaStore.Images.Media.DATE_MODIFIED} DESC"
        val localPhotos = arrayListOf<Uri>()
        contentResolver.query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection,
                selection,
                selectionArgs,
                sortOrder
        )?.use { cursor ->
            while (cursor.moveToNext()) {
                val index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID)
                val id = cursor.getLong(index)
                val contentUri = ContentUris.withAppendedId(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        id
                )
                localPhotos.add(contentUri)
            }
        }
    
        return localPhotos
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 2012-09-30
      • 2015-06-13
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多