【问题标题】:I want to load all images from my gallery but my cursor return false when i am calling cursor.moveToFirst()我想从我的画廊加载所有图像,但是当我调用 cursor.moveToFirst() 时我的光标返回 false
【发布时间】:2020-10-04 10:26:56
【问题描述】:

我的代码:

    public void loadImageFromStorage(Context context,Activity activity){
    Uri uri=null;
    Uri uriExternal= MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    int colIndexId;
    ///////////////////////////////////////////////////
    Cursor cursor=getContentResolver().query(uriExternal,null,null,null,null);
    
    
    //////////////////////////////////////////////////
    if(cursor!=null){
    colIndexId=cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
    int noOfRows=cursor.getCount();
    boolean isFirstRow=cursor.moveToFirst();
    do
    {
        uri= ContentUris.withAppendedId(uriExternal,cursor.getLong(colIndexId));
        imageUri.add(uri);
    }while(cursor.moveToNext());
    cursor.close();
    ImageAdapter imageAdapter=new ImageAdapter(this,imageUri,getContentResolver());
    gridView.setAdapter(imageAdapter);

}}

在我的代码中

cursor.getCount() 返回 0 和 cursor.moveToFirst() 返回 false (这意味着我的光标指向的表包含 0 行)。此时我的代码无法正常工作。我使用了正确的 mediastore uri,但我仍然无法从图库中获取图像。我不知道我在这里缺少什么? 最近几天我遇到了这个问题,但我仍然无法解决它。

请帮我解决这个问题。

提前致谢

【问题讨论】:

  • colIndexId=cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); int noOfRows=cursor.getCount(); 在检查 null 之前,您已经使用了两次 cursor。请更改您的代码以使其健壮。没有三遍!
  • 不要调用 moveToFirst 两次。
  • 放入 colIndexId=cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID); int noOfRows=cursor.getCount(); if 语句中的这两行(cursor!=null) 但仍然 cursor.getCount 返回 0 并且 moveToFirst 返回 false
  • 如果 cursor==null,这并不能避免 NullPointerException。如果您认为确实如此,那为什么还要稍后检查 null 呢?
  • 这是我在调试 cursor={ContentResolver$CursorWrapperInner@9670} 、 noOfRows==0 和 isFirstRow=false 后得到的,并且在我的 do while 循环中生成错误原因:android.database .CursorIndexOutOfBoundsException: 请求索引 0,大小为 0

标签: android cursor mediastore


【解决方案1】:

尝试下一个。考虑到您需要具有读取权限:android.permission.READ_EXTERNAL_STORAGE。因此,除了在清单中包含它之外,您还需要请求被授予。

public void loadImageFromStorage(final Context context){

    final Uri source = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
    final Cursor cursor = context.getContentResolver().query(source,null,null,null,null);

    if (cursor != null && cursor.moveToFirst()) {

        final int columnId = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
        final List<Uri> list = new ArrayList<>();
        
        do {
            final long mediaId = cursor.getLong(columnId);
            final Uri uri= Uri.withAppendedPath(source, Long.toString(mediaId));
            list.add(uri);
        } while(cursor.moveToNext());
        
        final ImageAdapter imageAdapter = new ImageAdapter(this, list, context.getContentResolver());
        gridView.setAdapter(imageAdapter);
    }
    
    if (cursor != null)
        cursor.close();
}

【讨论】:

  • 谢谢@PerracoLabs 我明白了。在这里,我没有要求运行时权限来访问所有图像
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-28
  • 1970-01-01
  • 2019-11-11
  • 2020-06-30
  • 2012-01-16
相关资源
最近更新 更多