从图库上传的图片未显示在ImageView中

时间:2017-02-22 13:38:46

标签: android xml imageview

我知道关于这个主题还有其他几个问题,但没有一个解决方案适合我。我在清单中添加了权限。我可以打开图库选择一张照片并返回到应用程序,但imageView不会改变。该应用程序正在进行一些处理,我没有收到任何错误。我试过在将图像插入我的imageview之前尝试缩放图像而没有运气。

这是我的代码:

public class UserDetailsFragment extends Fragment {
private Context context;
private ImageView imageView;
private Bitmap uploadedImage;
public static final int RESULT_IMAGE = 0;


public UserDetailsFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    context =  getActivity();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_user_details, container, false);
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState){
    imageView = (ImageView) getView().findViewById(R.id.profile_picture);
    imageView.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, RESULT_IMAGE);
        }
    });
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK){
        Uri selectedImage = data.getData();
        String[] filePathColumn = {MediaStore.Images.Media.DATA};
        Cursor cursor = context.getContentResolver().query(
                selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();
        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String filePath = cursor.getString(columnIndex);
        cursor.close();
        try {
            InputStream in = new URL(filePath).openStream();
            uploadedImage = BitmapFactory.decodeStream(in);
            imageView.setImageBitmap(uploadedImage);
        }catch (Exception ex){

        }
    }
}

}

这是我的imageView:

<ImageView
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_marginTop="-160dp"
    android:layout_gravity="center"
    android:layout_below="@+id/imageView"
    android:src="@drawable/user_details_icon"
    android:id="@+id/profile_picture" />

修改

我尝试使用毕加索,但仍然没有运气:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(resultCode == RESULT_OK){


        Picasso.with(context)
                .load(MediaStore.Images.Media.DATA)
                .resize(10, 10)
                .centerCrop()
                .into(imageView);

    }

2 个答案:

答案 0 :(得分:1)

在您之前的代码中,问题出在以下几行:

InputStream in = new URL(filePath).openStream();
uploadedImage = BitmapFactory.decodeStream(in);

这些行正在创建异常,因为它负责从服务器下载图像并将其转换为Bitmap。当您从本地存储中选择图像时,图像的路径类似于

  

/storage/emulated/0/DCIM/Camera/IMG_20170209_183830841.jpg

当您将新网址()作为参数传递时,会产生以下异常

  

java.net.MalformedURLException:未找到协议

首先,您需要在清单文件和 onActivityResult()中添加 READ_EXTERNAL_STORAGE 权限,您必须替换

InputStream in = new URL(filePath).openStream();
uploadedImage = BitmapFactory.decodeStream(in);

 File image = new File(filePath);
 BitmapFactory.Options bmOptions = new BitmapFactory.Options();
 Bitmap bitmap = BitmapFactory.decodeFile(image.getAbsolutePath(), bmOptions);
 bitmap = Bitmap.createScaledBitmap(bitmap, imageView.getWidth(), imageView.getHeight(), true);

注意:如果是棉花糖,请不要忘记在代码中添加安全权限。

答案 1 :(得分:0)

  

我尝试使用毕加索,但仍然没有运气:

这是因为你没有使用正确的Uri。您正在使用指向整个扫描媒体集的Uri

如果你看过the documentation for ACTION_PICK,它就有:

  

输出:已挑选项目的URI。

此处,有问题的Uri是通过致电getData() Intent来获取的onActivityResult()

因此,请将.load(MediaStore.Images.Media.DATA)替换为.load(data.getData())

另外,最有可能的是,你需要增加图像的大小,因为10px x 10px的图像会相当小。