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显示

为啥我使用postScale缩放图片之后,再使用imageView.layout()这个方法移动图片就没有效果了

Android 照相 滤镜

android里ImageButton 的android:src属性对应的函数是啥