ImageView.setImageBitmap 为空白
Posted
技术标签:
【中文标题】ImageView.setImageBitmap 为空白【英文标题】:ImageView.setImageBitmap is blank 【发布时间】:2013-07-14 23:48:08 【问题描述】:我使用 MediaStore 拍了一张照片并保存了它。我可以在我的图库中看到该图像。但是,当我尝试将图像位图设置为我的 ImageView 时,它变为空白。
String abspath;
public void getPicture(View view)
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File imageFile = new File(PATH + "/image.jpg");
abspath = imageFile.getAbsolutePath().toString();
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile));
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(abspath)))
startActivityForResult(cameraIntent, RESULT_CAMERA);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
setContentView(R.layout.activity);
if(requestCode == RESULT_CAMERA)
// open the image file
Bitmap bitmap = BitmapFactory.decodeFile(abspath);
ImageView imageView = (ImageView)findViewById(R.id.imageView);
imageView.setImageBitmap(bitmap); //imageView is now blank, although my saved image is not a blank image
//imageView.setImageURI(Uri.fromFile(new File(abspath))); same result
【问题讨论】:
您在哪个 Android 版本上测试代码? 【参考方案1】:我不知道,但是在 API 版本 17 中作为 onActivityResult()
的一部分从相机获取图像时有一些变化。您正在尝试使用 imagePath 获取图像。但实际上相机并没有以给定的名称存储它。它使用自己的机制来存储图像。你可以通过进入画廊看到。图像名称将与您提供的名称不同。建议最好使用 ContentResolver 查询上次捕获的图像。您可以根据需要修改查询。下面只是一个例子。
protected void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == PIC_CAMERA_IMAGE && resultCode == RESULT_OK)
Uri selectedImage=null;
// Works on API 16 or Below
if(null!=data)
selectedImage = data.getData();
// For API 17
if(null==selectedImage)
final ContentResolver cr = getContentResolver();
final String[] p1 = new String[]
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATE_TAKEN
;
Cursor c1 = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null, null, p1[1] + " DESC");
if ( c1.moveToFirst() )
String uristringpic = "content://media/external/images/media/" +c1.getInt(0);
selectedImage = Uri.parse(uristringpic);
c1.close();
【讨论】:
【参考方案2】:在我自己的代码中,我在尝试从媒体 URI 读取之前进行了以下调用:
activity.getContentResolver().notifyChange(mediaUri, null);
Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
intent.setData(mediaUri);
activity.sendBroadcast(intent);
这是为了确保系统正确更新以解析内容 URI。
编辑:抱歉,我注意到您正在尝试从文件路径而不是 URI 中读取。我不知道为什么这可能会失败(权限问题除外),但也许您可以尝试通过从 URI.fromFile(imageFile) 获得的 URI 访问文件。
【讨论】:
【参考方案3】:这对我有用:
Intent intent = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
mCapturedImageURI);
startActivityForResult(intent, TAKE_PICTURE)
接着是:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
super.onActivityResult(requestCode, resultCode, data);
String imagePath = null;
if (requestCode == TAKE_PICTURE)
if (resultCode == Activity.RESULT_OK)
imagePath = getPath(mCapturedImageURI);
if (imagePath != null)
// TODO: to this from asynctask
ExifInterface exif = null;
try
exif = new ExifInterface(imagePath);
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
mBabymScaledPhoto = mApp.getBabyBitmapFromPath(imagePath,
orientation);
ImageView iv = (ImageView) fragView
.findViewById(R.id.welcome_iv_babyPhoto);
iv.setImageBitmap(mBabymScaledPhoto);
public String getPath(Uri uri)
String[] projection = MediaStore.Images.Media.DATA ;
CursorLoader cursorLoader = new CursorLoader(fragView.getContext(),
uri, projection, null, null, null);
Cursor cursor = cursorLoader.loadInBackground();
if (cursor != null)
// HERE YOU WILL GET A NULLPOINTER IF CURSOR IS NULL
// THIS CAN BE, IF YOU USED OI FILE MANAGER FOR PICKING THE MEDIA
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
else
return null;
【讨论】:
以上是关于ImageView.setImageBitmap 为空白的主要内容,如果未能解决你的问题,请参考以下文章
Android ImageView setImageBitmap 不显示图片
Android获取数据库图片uri路径并用imageView显示