简体   繁体   English

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

[英]Select multiple images from Photo Gallery on Android using Intents NullPointerException

I try to select multiple images from photo gallery and save it in my custom folder on sdCard. 我尝试从照片库中选择多个图像并将其保存在sdCard上的自定义文件夹中。 I wrote some code but i have nullPintException this is a my source 我写了一些代码,但是我有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);

and this is OnActivityResultCode 这是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();
    }
}

this is my source .i have two errors. 这是我的来源。我有两个错误。 first when i click only one image in my gallery clipData is null and second,when i choose multiple images from gallery and click ok button i have this error 首先,当我仅单击图库中的一个图像时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

error is in this function getRealPathFromURI() how i can solve both problems? 此函数中的错误是getRealPathFromURI()我如何解决两个问题? thanks 谢谢

Select images from device 从设备中选择图像

//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);
        }
}

Activity result 活动结果

 //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();
        }

    }

genarate images path using Image URI 使用图片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;
    }

This is image bean where stored image URI and Image 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;
    }
}

For display image use Picasso 对于显示图像,请使用毕加索

compile 'com.squareup.picasso:picasso:2.5.2' 编译'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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM