ImageView中无法加载显示本地SDCard图片问题的解决方法

今天碰到一个非常蛋疼的问题:
在Android中ImageView无法显示加载的本地SDCard图片。
具体过程是:先调用本地照相机程序摄像,然后将拍摄的图片加载在ImageView中显示。
下面我将贴出我的代码和最后的解决方法,有类似问题的同学可以尝试一下。

这段我的拍照的页面的java代码,我把实现拍照按钮的程序部分贴出来了,这里主要做了几件小事

1 打开一个文件用来存储拍摄到的照片

2 获取照片的Uri
3 调用系统相机进行拍照
private static TAKE_PHOTO = 1private 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);

好啦,问题应该就解决啦

你可能感兴趣的:(android)