为什么cursor.getColumnIndexOrThrow()给出nullpointerexception?

时间:2015-12-16 11:25:23

标签: java android nullpointerexception

我正在尝试从文件夹fizzzzz中获取一个单击的图像并将其显示在listview中,但光标正在给出空指针异常。我是android新手。请帮帮我。

//拍照

    private void activeTakePhoto() {
    final Dialog dialog = new Dialog(this);
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    int MEDIA_TYPE_IMAGE = 1;
        fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // create a file to save the image
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // set the image file name

        // start the image capture Intent
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        try {
            FileOutputStream outputStream_image = openFileOutput(file_image, MODE_WORLD_READABLE);
            outputStream_image.write(string.getBytes());
            outputStream_image.close();
            Toast.makeText(getBaseContext(), "location of image saved", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     private Uri getOutputMediaFileUri(int MEDIA_TYPE_IMAGE) {
    // TODO Auto-generated method stub

    if(isExternalStorageWritable()) {
        Toast.makeText(getBaseContext(),"Verifying SD card",Toast.LENGTH_SHORT).show();
        return Uri.fromFile(getOutputMediaFile(MEDIA_TYPE_IMAGE));
    }

    return null;
}

/ *检查外部存储器是否可用于读写* /

  public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

private File getOutputMediaFile(int type) {
    // To be safe, you should check that the SDCard is mounted
    // using Environment.getExternalStorageState() before doing this.

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "Fizzzzzzz");
    // This location works best if you want the created images to be shared
    // between applications and persist after your app has been uninstalled.
    // Create the storage directory if it does not exist
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d("MyCameraApp", "failed to create directory");
            Toast.makeText(getBaseContext(),"File directory creation failed",Toast.LENGTH_LONG).show();
            return null;
        }
    }
    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    int MEDIA_TYPE_IMAGE = 1;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".jpg");
        Toast.makeText(getBaseContext(),"Created file name",Toast.LENGTH_LONG).show();
    } else {
        return null;
    }
    return mediaFile;
}

// onActivityResult

  case REQUEST_IMAGE_CAPTURE:
            if (requestCode == REQUEST_IMAGE_CAPTURE &&
                    resultCode == RESULT_OK) {
               final Dialog dialog= new Dialog(this);
                String[] projection = {MediaStore.Images.Media.DATA};
                Cursor cursor =
                        managedQuery(fileUri, projection, null,
                                null, null);
                int column_index_data = cursor.getColumnIndexOrThrow(
                        MediaStore.Images.Media.DATA);   //NullPointerException here.
                cursor.moveToFirst();
                String picturePath = cursor.getString(column_index_data);
                MyImage image = new MyImage();
                image.setTitle(fname);
                image.setDescription(" ");
                image.setDatetime(System.currentTimeMillis());
                image.setPath(picturePath);
                images.add(image);
                daOdb.addImage(image);
                adapter.notifyDataSetChanged();
               // listView.invalidateViews();
                dialog.cancel();
            }
    }

}

1 个答案:

答案 0 :(得分:1)

managedQuery()ContentResolver#query()的包装器,它可以返回null。在尝试调用任何方法之前,您需要检查cursor != null