今天碰到一个非常蛋疼的问题:
在Android中ImageView无法显示加载的本地SDCard图片。
具体过程是:先调用本地照相机程序摄像,然后将拍摄的图片加载在ImageView中显示。
下面我将贴出我的代码和最后的解决方法,有类似问题的同学可以尝试一下。
1 打开一个文件用来存储拍摄到的照片
private static TAKE_PHOTO = 1;
private Uri imageUri;
Button take_photo = (Button) findViewById(R.id.take_photo);
take_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// use camera to take a photo and show it in next page
// create file object to store the picture took by camera
File outputImage = new File(getExternalCacheDir(), "output_image.png");
try{
if(outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
// create image URI
if(Build.VERSION.SDK_INT >= 24){ // lower than Android 7.0
imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.android.uidesign.fileProvider", outputImage);
}else{
imageUri = Uri.fromFile(outputImage);
}
// turn on camera
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
// request code:TAKE_PHOTO = 1, private static
}
});
然后是manifest配置文件要添加对sd卡访问的许可:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这部分是在MainActivity中写的处理拍照后返回结果,对应上面的
startActivityForResult(), 这里选择将图片在下一个活动中展示,所以将imageUri 传给了下一个活动 show_pic
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if(resultCode == RESULT_OK){
// send the imageUri to next Uri (as a string)
Intent intent = new Intent(MainActivity.this, Show_pic.class);
intent.putExtra("imageUri", imageUri.toString());
startActivity(intent);
}
break
default:
break;
}
}
最后这部分是在另一个activity中,拿到上一个活动中传过来的Uri,然后打开一个输入流,解析成bitmap,最后在布局文件的ImageView中显示出来
这里也就是这段代码处错误的地方,感觉非常神奇,因为在有的手机上是可以显示出照片的,而在博主自己的小米4上运行是无法显示图片的,查了一下sd卡里对应的包,照片确实是被存进去了,但不知道是显示的太小了还是怎么样,死活看不到图片,在网上看到有很多人有类似的问题,有个博主的类似问题帖大家可以看一下
Intent intent = getIntent();
Uri imageUri = Uri.parse(intent.getStringExtra("imageUri"));
// display the picture
ImageView picture = (ImageView) findViewById(R.id.picture);
try{
Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
}catch (FileNotFoundException e){
e.printStackTrace();
}
在一番绝望的尝试之后,终于找到了解决办法,当然那个博主提供的办法可能也可以,只是我的manifest文件里并没有定义
[html] view plain copy print?
<uses-sdk android:minSdkVersion="8" />
这些东西,感觉自己还是太小白了吧。。。
那么下面是解决了的代码,只要把最后一段show_pic.java的代码改掉就好了
改成decodeFile的方式。用那个Uri获取一下image的路径,然后设置一下option里的inSampleSize,最后还是用bitmap显示
Intent intent = getIntent();
Uri imageUri = Uri.parse(intent.getStringExtra("imageUri"));
// display the picture
ImageView picture = (ImageView) findViewById(R.id.picture);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(imageUri.getPath(), options);
picture.setImageBitmap(bitmap);
好啦,问题应该就解决啦