【发布时间】:2015-04-29 00:04:33
【问题描述】:
我在三星 Galaxy S4(型号:GT-I9500)上运行一些基本代码时遇到了一个特定问题。
我正在通过相机或画廊实现图像选择器,但我一生都无法弄清楚为什么 ImageView 在调用时为空白 -
imageView.setImageURI(uri);
直到我在模拟器(然后是 Nexus 5)中运行完全相同的代码后,我才发现这是三星 S4 的问题。
完整的示例项目可以在Github & ready to run找到
我使用的代码取自SO post:
在OnCreate中:
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("Choose Image Source");
builder.setItems(new CharSequence[]{"Gallery", "Camera"},
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case 0:
//Launching the gallery
Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, GALLERY);
break;
case 1:
//Specify a camera intent
Intent getCameraImage = new Intent("android.media.action.IMAGE_CAPTURE");
File cameraFolder;
//Check to see if there is an SD card mounted
if (android.os.Environment.getExternalStorageState().equals
(android.os.Environment.MEDIA_MOUNTED))
cameraFolder = new File(android.os.Environment.getExternalStorageDirectory(),
IMAGEFOLDER);
else
cameraFolder = MainActivity.this.getCacheDir();
if (!cameraFolder.exists())
cameraFolder.mkdirs();
//Appending timestamp to "picture_"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
String timeStamp = dateFormat.format(new Date());
String imageFileName = "picture_" + timeStamp + ".jpg";
File photo = new File(Environment.getExternalStorageDirectory(),
IMAGEFOLDER + imageFileName);
getCameraImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo));
//Setting a global variable to be used in the OnActivityResult
imageURI = Uri.fromFile(photo);
startActivityForResult(getCameraImage, CAMERA);
break;
default:
break;
}
}
});
builder.show();
}
});
OnActivityResult:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case GALLERY:
Uri selectedImage = data.getData();
imageView.setImageURI(selectedImage);
break;
case CAMERA:
imageView.setImageURI(imageURI);
break;
}
}
}
使用时也会发生 Picasso
if (resultCode == RESULT_OK) {
switch (requestCode) {
case GALLERY:
Uri selectedImage = data.getData();
Picasso.with(context)
.load(selectedImage)
.into(imageView);
break;
case CAMERA:
Picasso.with(context)
.load(imageURI)
.into(imageView);
break;
}
}
使用位图工厂时也会发生
try {
Bitmap bitmap = BitmapFactory.decodeStream(context.getContentResolver().openInputStream(imageURI));
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
在运行 4.2.2 的三星 S4 上运行时的结果
在运行 Android 4.4.4 的 GenyMotion 2.4.0 上运行时的结果
有人知道为什么会这样吗?
【问题讨论】:
-
setImageURI()很少是一个好主意,因为这会将图像加载到主应用程序线程上。 -
从图库中加载图像时,更好的解决方案是什么?
-
使用many image loading libraries 之一,它将在后台线程上加载图像并在准备好时将其应用于
ImageView。或者,自己做,也许使用AsyncTask。 -
所以我尝试使用毕加索,但这也不起作用。它仍然加载一个空白的图像视图。我会将它添加到 github 存储库中。
-
嗯,这有点奇怪。您从
MediaStore提取的所有图像都会发生这种情况,还是仅部分发生这种情况?
标签: android camera imageview gallery onactivityresult