1

我正在尝试从 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);
    }
}

当我尝试从文件系统加载拍摄的图片时,情况变得很奇怪。当 a 时,它按预期工作。我从 EasyScreenshot 文件中选择了一张图片,但是当 b. 我从 DCIM/Camera 路径中选择图片它不起作用。如果我在 a 处运行 Log.d 代码。案例打印:

相机: ____content://media/external/images/media/27487

和第二个 Log.d :

CAMERA:----/storage/emulated/0/Pictures/Screenshots/Screenshot_2014-12-18-15-14-22.png

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

第一个 log.d :

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

和第二个 log.d :

相机:----null

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

先感谢您

4

2 回答 2

6

您不能假设媒体选择器返回的 Uri 将对应于本地文件。您似乎选择了 G+ 照片或设备中没有的其他图片。

正确的方法是使用 aContentResolver将图片作为流访问。例如:

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。

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

于 2014-12-21T02:04:17.903 回答
2

您必须使用内容提供商处理 content://com.google.android.apps.photos.content 类型的 URL,就像您已经做到的那样。但是,您应该尝试这样做,跳过真实的文件路径,只获取位图本身。

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

于 2014-12-21T01:33:33.113 回答