这个问题最初是针对Android 1.6提出的。

我正在我的应用程序中的照片选项。

我的Activity中有一个按钮和一个ImageView。当我点击按钮,它会重定向到图库,我将能够选择一个图像。所选的图像将出现在我的ImageView中。


当前回答

由于某些原因,这个线程中的所有答案,在onActivityResult()中尝试对接收到的Uri进行后处理,比如获得图像的真实路径,然后使用BitmapFactory.decodeFile(path)来获得位图。

此步骤无需执行。ImageView类有一个叫做setImageURI(uri)的方法。将您的uri传递给它,您就应该完成了。

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

完整的工作示例可以在这里查看:http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

PS: 在要加载的图像太大而无法装入内存的情况下,在一个单独的变量中获取位图是有意义的,并且需要一个缩小操作来防止OurOfMemoryError,就像@siamii答案中所示的那样。

其他回答

你必须为一个结果开始画廊意图。

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

然后在onActivityForResult中调用intent.getData()来获取图像的Uri。然后你需要从ContentProvider中获取图像。

private static final int SELECT_PHOTO = 100;

开始的目的

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);    

过程的结果

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

    switch(requestCode) { 
    case SELECT_PHOTO:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            InputStream imageStream = getContentResolver().openInputStream(selectedImage);
            Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
        }
    }
}

或者,你也可以降低你的图像样本,以避免OutOfMemory错误。

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {

        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o);

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

        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
               || height_tmp / 2 < REQUIRED_SIZE) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2);

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

}

由于某些原因,这个线程中的所有答案,在onActivityResult()中尝试对接收到的Uri进行后处理,比如获得图像的真实路径,然后使用BitmapFactory.decodeFile(path)来获得位图。

此步骤无需执行。ImageView类有一个叫做setImageURI(uri)的方法。将您的uri传递给它,您就应该完成了。

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

完整的工作示例可以在这里查看:http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

PS: 在要加载的图像太大而无法装入内存的情况下,在一个单独的变量中获取位图是有意义的,并且需要一个缩小操作来防止OurOfMemoryError,就像@siamii答案中所示的那样。

这样做可以启动图库,并允许用户选择一张图片:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK);

然后在onActivityResult()中使用返回的图像的URI来设置ImageView上的图像。