setImageBitmap()无法工作

4

我有一个ImageView,它应该用以下代码从图库中填充一张图片:

Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
            getIntent.setType("image/*");
            Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            pickIntent.setType("image/*");

            Intent chooserIntent = Intent.createChooser(getIntent, "Pick an image.");
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

            startActivityForResult(chooserIntent, PICK_IMAGE_REQUEST);

现在,这段代码的这部分一切正常,问题在onActivityResult()中,确切地说是在setImageBitmap()中,因为imageView没有采用来自Gallery的图像。这是来自onActivityResult()的代码:

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

    if(requestCode == PICK_IMAGE_REQUEST || resultCode == PromoUpload.RESULT_OK){

        Uri selectedImage = data.getData();
        String[] filepathColumm = {MediaStore.Images.Media.DATA};

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

        int columnIndex = cursor.getColumnIndex(filepathColumm[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
        imagePromo.setImageBitmap(bitmap);
        pictureFlag = 1;

    }

我烤了一下picturePath属性,它正常显示了,问题就出在这里:
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
    imagePromo.setImageBitmap(bitmap);

但是我不知道我做错了什么。这是ImageView的XML代码:
<ImageView
        android:id="@+id/imageView_promo"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_centerHorizontal="true"
        android:padding="1dp" />

我也尝试从多个尺寸中选择图像,但似乎无法正常工作...

2个回答

7
但是我不知道我的做法哪里出了问题。
你认为每个Uri都来自MediaStore,并且MediaStore中的每个条目都有一个有用的路径,这是错误的。你应该将selectedImage传递给图像加载库(Glide、Picasso等),因为这些库不仅知道如何正确使用Uri,而且它们将在后台线程上加载图像,而不会像你在此处冻结UI。你还可以教会图像加载库缩放图像以适合你的ImageView,以节省堆空间。
更直接地替换您代码的方式如下:
    Uri selectedImage = data.getData();
    Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage));
    imagePromo.setImageBitmap(bitmap);
    pictureFlag = 1;

但是,需要注意的是,这样做会在磁盘I/O和图像解码进行时冻结您的UI界面。


谢谢!替换帮助了我很多。无论如何,像你说的那样,我会尝试在我的项目中实现Glide或Picasso。 - I'l Follio

0

会帮忙这个,

BitmapFactory.Options bmOptions = new BitmapFactory.Options();
Bitmap bitmap = BitmapFactory.decodeFile(picturePath,bmOptions);
imageView.setImageBitmap(bitmap);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接