【发布时间】:2017-02-22 13:38:45
【问题描述】:
我知道关于这个主题还有其他几个问题,但没有一个解决方案对我有用。我在清单中添加了权限。我可以打开图库选择一张照片并返回到应用程序,但 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
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);
}
【问题讨论】:
-
首先,永远不要在没有记录的情况下捕获
Exception,因为您是onActivityResult()。其次,您的onActivityResult()代码是错误的,因为您可能无权使用文件路径(例如,它指向可移动存储)并且您正在主应用程序线程上执行磁盘 I/O。使用image-loading library,如Picasso,将Uri传递给它,以正确使用Uri并异步填充ImageView。 -
感谢您的提示。我对Android相当陌生,所以我实际上并不了解毕加索。我不确定我是否理解您对 onActivityResult() 的意思,但我尝试将其更改为内部存储,但仍然没有运气。我也改变了我的整个 onActivityResult(见编辑)但仍然没有运气