试图从DCIM中获取图片时候出现的奇怪问题

文章标签: android,android-intent
2014-12-31 21:33:25     人阅读    


使用如下的代码从DCIM中加载图片

int BROWSE_PICTURES = 0;
public void openBrowsePictures() {
    Intent i = new Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

    startActivityForResult(i, BROWSE_PICTURES);
}

onActivityResult 的代码如下

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == BROWSE_PICTURES && resultCode == RESULT_OK && null != data) { // we have bitmap from filesystem!
        Uri selectedImage = data.getData();
        Log.d("CAMERA","____"+selectedImage.toString());


        String[] filePathColumn = {MediaStore.Images.Media.DATA};



        Cursor cursor = getContentResolver().query(
                selectedImage, filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        Log.d("CAMERA", " column : " + columnIndex);
        String filePath = cursor.getString(columnIndex);
        cursor.close();


        Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);


        Log.d("CAMERA", "----" + filePath);
    }
}

当我从文件系统加载一个图片开始出现奇怪的问题,当我从 EasyScreenshot 文件中选择图片,我从 DCIM/Camera 中选择图片时就不能运行了,Log.d输入了如下信息.

\\
CAMERA﹕ ____content://media/external/images/media/27487
and the second Log.d :
CAMERA﹕ ----/storage/emulated/0/Pictures/Screenshots/Screenshot_2014-12-18-15-14-22.png
but , in case b it prints the following :
the first log.d :
CAMERA: ____content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh5.googleusercontent.com%2F7tUacBA_4oYS2Q8CmkINWHa93B_n7heNyt3OyVZgkY8%3Ds0-d
and the second log.d :
CAMERA﹕ ----null

我的运行环境是   nexus 4  + Android 5.0.1

处理方法

你无法确认返回的URI媒体选择器会是否本地文件对应,问题看起来像似你选择的图片并不在你的设备中

正确的方式是使用 ContentResolver to 把图片变成 stream流,例如:

InputStream inputStream = null;
if (ContentResolver.SCHEME_CONTENT.equals(selectedImage.getScheme())) {
    inputStream = context.getContentResolver().openInputStream(selectedImage);
} else if (ContentResolver.SCHEME_FILE.equals(selectedImage.getScheme())) {
    inputStream = new FileInputStream(selectedImage.getPath());
}


bitmap = BitmapFactory.decodeStream(inputStream);

上面的代码对  content:// 和 file:// uris.都能友好的支持

必须保证是在后台线程做这些功能,不然你会得到NetworkOnMainThreadException,如果你使用了 remote uri 


原文地址:http://www.itmmd.com/201412/422.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

Android摄像头预览拉伸   上一篇
下一篇  为什么ListView在滚动的时候里面的文本内容会消失
精彩回复
我要追加问题,请求站长解决!
姓名:       

《程序员app》专门为程序员量身定做!