How to pick an image from gallery (SD Card) for my app?

前端 未结 10 1877
Happy的楠姐
Happy的楠姐 2020-11-21 23:40

This question was originally asked for Android 1.6.

I am working on photos options in my app.

I have a button and an ImageView in my Activity. When I click

相关标签:
10条回答
  • 2020-11-22 00:00

    For some reasons, all of the answers in this thread, in onActivityResult() try to post-process the received Uri, like getting the real path of the image and then use BitmapFactory.decodeFile(path) to get the Bitmap.

    This step is unnecessary. The ImageView class has a method called setImageURI(uri). Pass your uri to it and you should be done.

    Uri imageUri = data.getData();
    imageView.setImageURI(imageUri);
    

    For a complete working example you could take a look here: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

    PS:
    Getting the Bitmap in a separate variable would make sense in cases where the image to be loaded is too large to fit in memory, and a scale down operation is necessary to prevent OurOfMemoryError, like shown in the @siamii answer.

    0 讨论(0)
  • 2020-11-22 00:03

    You have to start the gallery intent for a result.

    Intent i = new Intent(Intent.ACTION_PICK,
                   android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 
    

    Then in onActivityForResult, call intent.getData() to get the Uri of the Image. Then you need to get the Image from the ContentProvider.

    0 讨论(0)
  • 2020-11-22 00:08
    public class BrowsePictureActivity extends Activity {
    private static final int SELECT_PICTURE = 1;
    
    private String selectedImagePath;
    
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    
        ((Button) findViewById(R.id.Button01))
                .setOnClickListener(new OnClickListener() {
    
                    public void onClick(View arg0) {
    
                        Intent intent = new Intent();
                        intent.setType("image/*");
                        intent.setAction(Intent.ACTION_GET_CONTENT);
                        startActivityForResult(Intent.createChooser(intent,
                                "Select Picture"), SELECT_PICTURE);
                    }
                });
    }
    
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
            }
        }
    }
    
    public String getPath(Uri uri) {
    
            if( uri == null ) {
                return null;
            }
    
            // this will only work for images selected from gallery
            String[] projection = { MediaStore.Images.Media.DATA };
            Cursor cursor = managedQuery(uri, projection, null, null, null);
            if( cursor != null ){
                int column_index = cursor
                .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            }
    
            return uri.getPath();
    }
    
    }
    
    0 讨论(0)
  • 2020-11-22 00:11

    Here is a tested code for image and video.It will work for all APIs less than 19 and greater than 19 as well.

    Image:

    if (Build.VERSION.SDK_INT <= 19) {
                            Intent i = new Intent();
                            i.setType("image/*");
                            i.setAction(Intent.ACTION_GET_CONTENT);
                            i.addCategory(Intent.CATEGORY_OPENABLE);
                            startActivityForResult(i, 10);
                        } else if (Build.VERSION.SDK_INT > 19) {
                            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                            startActivityForResult(intent, 10);
                        }
    

    Video:

    if (Build.VERSION.SDK_INT <= 19) {
                            Intent i = new Intent();
                            i.setType("video/*");
                            i.setAction(Intent.ACTION_GET_CONTENT);
                            i.addCategory(Intent.CATEGORY_OPENABLE);
                            startActivityForResult(i, 20);
                        } else if (Build.VERSION.SDK_INT > 19) {
                            Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
                            startActivityForResult(intent, 20);
                        }    
    

    .

         @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {               
                if (requestCode == 10) {
                    Uri selectedImageUri = data.getData();
                    String selectedImagePath = getRealPathFromURI(selectedImageUri);
                } else if (requestCode == 20) {
                    Uri selectedVideoUri = data.getData();
                    String selectedVideoPath = getRealPathFromURI(selectedVideoUri);
                }
            }
         }
    
         public String getRealPathFromURI(Uri uri) {
                if (uri == null) {
                    return null;
                }
                String[] projection = {MediaStore.Images.Media.DATA};
                Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
                if (cursor != null) {
                    int column_index = cursor
                            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    cursor.moveToFirst();
                    return cursor.getString(column_index);
                }
                return uri.getPath();
            }
    
    0 讨论(0)
  • 2020-11-22 00:13
    public class EMView extends Activity {
    ImageView img,img1;
    int column_index;
      Intent intent=null;
    // Declare our Views, so we can access them later
    String logo,imagePath,Logo;
    Cursor cursor;
    //YOU CAN EDIT THIS TO WHATEVER YOU WANT
    private static final int SELECT_PICTURE = 1;
    
     String selectedImagePath;
    //ADDED
     String filemanagerstring;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        img= (ImageView)findViewById(R.id.gimg1);
    
    
    
        ((Button) findViewById(R.id.Button01))
        .setOnClickListener(new OnClickListener() {
    
            public void onClick(View arg0) {
    
                // in onCreate or any event where your want the user to
                // select a file
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,
                        "Select Picture"), SELECT_PICTURE);
    
    
            }
        });
    }
    
    //UPDATED
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
    
                //OI FILE Manager
                filemanagerstring = selectedImageUri.getPath();
    
                //MEDIA GALLERY
                selectedImagePath = getPath(selectedImageUri);
    
    
                img.setImageURI(selectedImageUri);
    
               imagePath.getBytes();
               TextView txt = (TextView)findViewById(R.id.title);
               txt.setText(imagePath.toString());
    
    
               Bitmap bm = BitmapFactory.decodeFile(imagePath);
    
              // img1.setImageBitmap(bm);
    
    
    
            }
    
        }
    
    }
    
    //UPDATED!
    public String getPath(Uri uri) {
    String[] projection = { MediaColumns.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    column_index = cursor
            .getColumnIndexOrThrow(MediaColumns.DATA);
    cursor.moveToFirst();
     imagePath = cursor.getString(column_index);
    
    return cursor.getString(column_index);
    }
    
    }
    
    0 讨论(0)
  • 2020-11-22 00:15
    #initialize in main activity 
        path = Environment.getExternalStorageDirectory()
                + "/images/make_machine_example.jpg"; #
         ImageView image=(ImageView)findViewById(R.id.image);
     //--------------------------------------------------||
    
     public void FromCamera(View) {
    
        Log.i("camera", "startCameraActivity()");
        File file = new File(path);
        Uri outputFileUri = Uri.fromFile(file);
        Intent intent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, 1);
    
    }
    
    public void FromCard() {
        Intent i = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, 2);
    }
    
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == 2 && 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]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
    
            bitmap = BitmapFactory.decodeFile(picturePath);
            image.setImageBitmap(bitmap);
    
            if (bitmap != null) {
                ImageView rotate = (ImageView) findViewById(R.id.rotate);
    
            }
    
        } else {
    
            Log.i("SonaSys", "resultCode: " + resultCode);
            switch (resultCode) {
            case 0:
                Log.i("SonaSys", "User cancelled");
                break;
            case -1:
                onPhotoTaken();
                break;
    
            }
    
        }
    
    }
    
    protected void onPhotoTaken() {
        // Log message
        Log.i("SonaSys", "onPhotoTaken");
        taken = true;
        imgCapFlag = true;
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 4;
        bitmap = BitmapFactory.decodeFile(path, options);
        image.setImageBitmap(bitmap);
    
    
    }
    
    0 讨论(0)
提交回复
热议问题