我知道关于这个主题还有其他几个问题,但没有一个解决方案适合我。我在清单中添加了权限。我可以打开图库选择一张照片并返回到应用程序,但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);
}
答案 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的图像会相当小。