我正在尝试从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设备上测试应用程序
提前谢谢
答案 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类型的网址。但是你应该尝试这样做,跳过真正的文件路径,然后自己获取位图。