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

kar*_*tas 1 java android picturegallery android-intent

我正在尝试从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);
}
Run Code Online (Sandbox Code Playgroud)

并在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

和第二个Log.d:

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

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

第一个log.d:

摄像机:____内容://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设备上测试应用程序

先感谢您

mat*_*ash 6

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

正确的方法是使用a 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);
Run Code Online (Sandbox Code Playgroud)

这应该适用于两者content://file://uris.

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