使用Intents NullPointerException从Android上的照片库中选择多个图像

时间:2016-11-05 12:01:13

标签: java android image android-intent android-gallery

我尝试从照片库中选择多个图像并将其保存在sdCard上的自定义文件夹中。 我写了一些代码,但我有nullPintException 这是我的来源

  Intent intent = new Intent();
    intent.setType("image/*");
    intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent,"Select Picture"), PICK_FROM_GALLERY);

这是OnActivityResultCode

if(data!=null)
            {
                ClipData clipData = data.getClipData();
                for (int i = 0; i < clipData.getItemCount(); i++)
                {
                    Uri selectedImage = clipData.getItemAt(i).getUri();

                    if (selectedImage != null) {
                        mCurrentPhotoPath = getRealPathFromURI(selectedImage);
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
                        Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, options);
                        // bitmap=getResizedBitmap(bitmap,1280,720);
                        String partFilename = currentDateFormat();
                        if (bitmap != null) {
                            SaveImage(bitmap, partFilename);
                        }
                    }
                }




public String getRealPathFromURI(Uri uri) {
    Cursor cursor = CarRecieveActivity.this.getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}




        private void SaveImage(Bitmap finalBitmap,String fileName) {


    File myDir = new File(rootDirectory + "/"+vinNumber.getText().toString());
    myDir.mkdirs();
    String fname = fileName+".jpg";
    File file = new File (myDir, fname);
    try {
        FileOutputStream out = new FileOutputStream(file);
        finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        out.flush();
        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是我的来源。我有两个错误。 首先,当我在我的画廊中只点击一个图像时,clipData为空,其次,当我从图库中选择多个图像并单击确定按钮时出现此错误

 java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it

错误在此函数中getRealPathFromURI() 我怎么能解决这两个问题? 感谢

1 个答案:

答案 0 :(得分:0)

从设备中选择图像

//Uri to store the image uri
private List<Uri> filePath;
public String path[];
public static List<ImageBeen> listOfImage;

//Image request code
    private int PICK_IMAGE_REQUEST = 1;
    private int PICK_IMAGE_REQUEST_MULTI = 2;

    // select multiple image
    private void pickImages() {

  filePath = new ArrayList<>();
  listOfImage = new ArrayList<>();

        Intent intent;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                intent = new Intent();
                intent.setType("image/*");
                intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
                intent.setAction(Intent.ACTION_GET_CONTENT);
                intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
                intent.addCategory(Intent.CATEGORY_OPENABLE);
                startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST_MULTI);
}else {
            intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
            intent.addCategory(Intent.CATEGORY_OPENABLE);
            startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);
        }
}

活动结果

 //handling the image chooser activity result
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST_MULTI && resultCode == RESULT_OK && data != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            ClipData imagesPath = data.getClipData();

            if (imagesPath != null) {
                    path = new String[imagesPath.getItemCount()];
                    for (int i = 0; i < imagesPath.getItemCount(); i++) {
                        filePath.add(imagesPath.getItemAt(i).getUri());
                        path[i] = getPath(imagesPath.getItemAt(i).getUri());
                        ImageBeen imageBeen = new ImageBeen(imagesPath.getItemAt(i).getUri());
                        imageBeen.setPath(path[i]);
                        listOfImage.add(imageBeen);
                        initViewPager();
                    }
                }else {
                path = new String[1];
                path[0] = getPath(data.getData());
                ImageBeen imageBeen = new ImageBeen(data.getData());
                imageBeen.setPath(path[0]);
                listOfImage.add(imageBeen);
                initViewPager();
            }

        } else if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null) {
            path = new String[1];
            path[0] = getPath(data.getData());
            ImageBeen imageBeen = new ImageBeen(data.getData());
            imageBeen.setPath(path[0]);
            listOfImage.add(imageBeen);
            initViewPager();
        }

    }

使用图片URI

创建图片路径
 //method to get the file path from uri
    public String getPath(Uri uri) {

        Cursor cursor = getContentResolver().query(uri, null, null, null, null);
        String path = null;
        if(cursor!=null) {
            if (cursor.moveToFirst()) {
                String document_id = cursor.getString(0);
                document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
                cursor.close();

                cursor = getContentResolver().query(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
                cursor.moveToFirst();
                path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                cursor.close();

                return path;
            }
        }
        return path;
    }

这是图像bean,其中存储图像URI和图像路径

public class ImageBeen {
  private Uri fileUri;
private String path;

    public ImageBeen(Uri fileUri)
    {
        this.fileUri=fileUri;
    }

    public String getPath() {
        return path;
    }


    public void setPath(String path)
    {
        this.path=path;
    }


    public Uri getFileUri() {
        return fileUri;
    }
}

对于显示图像使用Picasso

  

编译'com.squareup.picasso:picasso:2.5.2'

 Picasso.with(context)
                .load(imageBeen.getFileUri())
                .placeholder(R.drawable.not_vailable)
                .error(R.drawable.not_vailable)
                .into(holder.image);