Android intent - pick image from gallery

2019-07-30 15:29发布

问题:

I am following this sample code to send an intent to get an image.

Intent i = new Intent();
i.setAction(Intent.ACTION_GET_CONTENT);

i.setType("image/*");

if (i.resolveActivity(getPackageManager()) != null) {
     startActivityForResult(i, 3);
}

In onActivityResult :

if(requestCode == 3 && resultCode == RESULT_OK) {
     Bitmap thumbnail = data.getParcelableExtra("data");

     if(thumbnail == null) {
        Toast.makeText(getApplicationContext(), "Thumbnail is null", Toast.LENGTH_SHORT).show();
        return;
     }

     ImageView iv = (ImageView) findViewById(R.id.imageView);
     iv.setImageBitmap(thumbnail);
 }

When the intent is sent, the image picker launches, and I select one of the images in the gallery. But in the onActivityResult, corresponding to the following statement in the sample code (I changed to getParcelableExtra in Android 4.4):

Bitmap thumbnail = data.getParcelable("data");

I get the thumbnail as null. I am testing on Genymotion VM.

What am I doing wrong ?

回答1:

        btnFromGallery.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                        try {
                            Intent intent = new Intent();
                            intent.setType("image/*");
                            intent.setAction(Intent.ACTION_GET_CONTENT);
                            Log.i("after select", "get image");
                            startActivityForResult(Intent.createChooser(intent, ""), PICK_IMAGE);
                        } catch (Exception e) {
                            Toast.makeText(getApplicationContext(), R.string.imageException, Toast.LENGTH_LONG).show();
                            Log.e(e.getClass().getName(), e.getMessage(), e);
                        }
                    }
                });

    //onActivityResult code:

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            switch (requestCode) {

            case PICK_IMAGE:
                if (resultCode == Activity.RESULT_OK) {
                    Log.i("On onActivityResult", "on Activity Result");
                    Uri selectedImageUri = data.getData();
                    String filePath = null;

                    try {
                        String filemanagerstring = selectedImageUri.getPath();

                        selectedImagePath = getPath(selectedImageUri);
                        if (selectedImagePath != null) {
                            filePath = selectedImagePath;
                        } else if (filemanagerstring != null) {
                            filePath = filemanagerstring;
                        } else {
                            Toast.makeText(getApplicationContext(), R.string.unknownPath, Toast.LENGTH_LONG).show();
                        }

                        if (filePath != null) {
                            decodeFile(filePath);
                        } else {
                            bitmap = null;
                        }
                    } catch (Exception e) {
                        Toast.makeText(getApplicationContext(), R.string.dataException, Toast.LENGTH_LONG).show();
                    }
                }
                break;

            }
        }


//Get Path Method

    public String getPath(Uri uri) {
            String[] projection = { MediaColumns.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            if (cursor != null) {
                int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            } else
                return null;
        }

//Decode File method

public void decodeFile(String filePath) {
        try {

            File f = new File(filePath);
            ExifInterface exif = new ExifInterface(f.getPath());
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

            int angle = 0;

            if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
                angle = 90;
            } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
                angle = 180;
            } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
                angle = 270;
            }

            Matrix mat = new Matrix();
            mat.postRotate(angle);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 2;

            Bitmap bmp = BitmapFactory.decodeStream(new FileInputStream(f), null, options);
            bitmap = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mat, true);
            ByteArrayOutputStream outstudentstreamOutputStream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, outstudentstreamOutputStream);
            imgEdit.setImageBitmap(bitmap);


回答2:

Can you try his answer? How to pick an image from gallery (SD Card) for my app?

use getData() instead of getParcelableExtra()

It will return you an Uri and you will need to use the ContentResolver to get the Image.

Also, use Intent.ACTION_PICK instead of Intent.ACTION_GET_CONTENT.



回答3:

Instead of getting the bitmap, fetch the URI from data and load the bitmap yourself.

           Uri selectedImageUri = data.getData();
           String selectedImagePath = getPath(selectedImageUri);


回答4:

Try this.. It help you

  /**
                     * Images uploaded through gallery
                     * 
                     */

                    btn_gallery.setOnClickListener(new OnClickListener()
                    {

                        @Override
                        public void onClick(View v)
                        {
                            if (v.getId() == R.id.btn_gallery)
                            {
                                upload = true;
                                gallery_upload();


                            }

                        }
                    });



     /**
             * By this method we can upload the image from gallery
             */
            public void gallery_upload()
            {
                Log.d("Upload", "inside gallery upload");
                Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

                startActivityForResult(i, RESULT_LOAD_IMAGE);

            }

    @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data)
        {
            super.onActivityResult(requestCode, resultCode, data);

            if (upload)
            {
                if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data)
                {
                    Uri selectedImage = data.getData();
                    String[] filePathColumn = { MediaStore.Images.Media.DATA };

                    Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                    cursor.moveToFirst();

                    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                    picturePath = cursor.getString(columnIndex);
                    Log.e("", "" + picturePath);
                    cursor.close();

                    imageView = (ImageView) findViewById(R.id.upload_register_image);

                    File image = new File(picturePath);
                    if (image.exists())
                    {
                        File f = image.getAbsoluteFile();
                        decodeFile(f);
                    }
                    else
                    {
                        Log.d("VEHICLEREGISTERATION", "image doesnt exist");
                    }

                    upload = false;

                    imagePath(picturePath);

                }
    }
    }
/**
 * Helps to decode size of the image
 * */
private Bitmap decodeFile(File f)
{
    try
    {
        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(new FileInputStream(f), null, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 70;

        // Find the correct scale value. It should be the power of 2.
        int scale = 1;
        while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE)
            scale *= 2;

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        Bitmap bit_map = BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        imageView.setImageBitmap(bit_map);

    }
    catch (FileNotFoundException e)
    {
    }
    return null;
}

public void imagePath(String Path)
{
    finalImgPath = Path;

}