cursor.getString(dataColumnIndex)给出空指针异常

时间:2018-04-04 08:39:13

标签: java android media mediastore database-cursor

我正在尝试使用媒体商店加载Android设备中的所有图片。

这就是我正在做的事情

public void getImages(Context context) {
    File Image_File;
    final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID};
    String orderBy = MediaStore.Images.Media.DATE_MODIFIED ;
    Cursor cursor = context.getContentResolver().query(
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
        null, orderBy);

    if (cursor != null){
        cursor.moveToFirst();
        final int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
        while (cursor.moveToNext()) {
            Image_File = new File(cursor.getString(dataColumnIndex));
        }
    }
  }
}

但下面的行给了我一个错误

Image_File = new File(cursor.getString(dataColumnIndex));

这是出现的错误

  

由java.lang.NullPointerException引起       尝试在空对象引用上调用虚方法'char [] java.lang.String.toCharArray()'

这是完整的Stack Trace

  

由java.lang.NullPointerException引起:尝试在空对象引用上调用虚方法'char [] java.lang.String.toCharArray()'           在java.io.File.fixSlashes(File.java:185)           在java.io.File。(File.java:134)           在PackageName.getImages(ClassName.java:87)           在PackageName.ClassName $ load.doInBackground(ClassName.java:52)           at PackageName.ClassName $ load.doInBackground(ClassName.java:39)           在android.os.AsyncTask $ 2.call(AsyncTask.java:292)           在java.util.concurrent.FutureTask.run(FutureTask.java:237)           在android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:231)           at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)           at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587)           在java.lang.Thread.run(Thread.java:818)

我知道还有其他SO帖子谈论此主题,例如this,但后来我觉得它们与我的案例无关。

此版本崩溃发生在Android版本5.0到7.0之间(我的应用程序的最低Android版本是5.0)。

任何帮助都会感激不尽,因为我无法在手机上回溯问题。

2 个答案:

答案 0 :(得分:0)

好吧,由于你已经调用了cursor.moveToFirst(),你的游标已经超过了前一个带有cursor.moveToNext()调用的条目。

moveToNext()

/**
     * Move the cursor to the next row.
     *
     * <p>This method will return false if the cursor is already past the
     * last entry in the result set.
     *
     * @return whether the move succeeded.
     */

你有没有尝试过:

try{
     while (cursor.moveToNext()) {
            Image_File = new File(cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)));
        }
    }catch (NullPointerException e){
       e.printStackTrace();
   }finally {
       if (cursor != null) {
           cursor.close();
       }

答案 1 :(得分:0)

试试这个

String orderBy = MediaStore.Images.ImageColumns.DATE_TAKEN + " DESC"; 

 Cursor cursor = this.getContentResolver().query( MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                projection, // Which columns to return
                null,       // Return all rows
                null,
                orderBy);

// Get the column index of the Thumbnails Image ID
        int columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
        for(int i =0;i<cursor.getCount();i++){
            cursor.moveToPosition(i);//List of all record
            image_file =new File(cursor.getString(columnIndex));
        }

        cursor.close();