尝试从DCIM获取图片时出现奇怪的行为

时间:2014-12-18 17:41:08

标签: java android android-intent picturegallery

我正在尝试从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文件中选择了一张图片,但是当b。我从DCIM /相机路径选择图片它不起作用。 如果我在a处运行代码Log.d。案例打印:

  

CAMERA:____content:// media / external / images / media / 27487

和第二个Log.d:

  

CAMERA:---- / storage / emulated / 0 /图片/截图/截图_2014-12-18-15-14-22.png

但是,如果是b,它会打印以下内容:

第一个log.d:

  

CAMERA:____content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh5.googleusercontent.com%2F7tUacBA_4oYS2Q8CmkINWHa93B_n7heNyt3OyVZgkY8%3Ds0-d

和第二个log.d:

  

CAMERA:---- null

我在运行Android 5.0.1的nexus 4设备上测试应用程序

提前谢谢

2 个答案:

答案 0 :(得分:6)

您不能假设媒体选择器返回的Uri将对应于本地文件。看起来您正在选择G +照片或设备中没有的其他图像。

正确的方法是使用ContentResolver以图片形式访问图片。例如:

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。

并且(非常重要)确保从后台线程(例如AsyncTask)执行此操作,否则如果uri是“远程”线程,您将获得NetworkOnMainThreadException

答案 1 :(得分:2)

您必须像使用内容提供商一样处理内容://com.google.android.apps.photos.content类型的网址。但是你应该尝试这样做,跳过真正的文件路径,然后自己获取位图。

https://stackoverflow.com/a/19835603/4380308