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设备上测试应用程序
先感谢您
您不能假设媒体选择器返回的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是"远程" 线程,您将获得一个.
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |