最近,Google为Google+(加号)添加了照片应用,当您启动Intent选择图片时,它会显示出来。但是,如果我从Google+照片中选择图片并尝试在我的应用程序中使用它,我当前的逻辑都无法返回可用的URI或URL来实际获取我可以下载和操作的图像。我目前正在使用“常用”方法来尝试操作可在Stack Overflow和其他地方找到的URI。如果需要,我可以提供代码,但此时我觉得它有点无关紧要,因为除了这个新的应用程序之外,它适用于其他所有内容。关于如何获得可用图像的任何想法?
URI类似于以下内容:
content://com.google.android.apps.photos.content/0/https%3A%2F%2Flh5.googleusercontent.com%<a bunch of letters and numbers here>
MediaColumns.DATA
信息始终返回null,MediaColumns.DISPLAY_NAME
始终返回image.jpg,无论我从Google相册应用中选择什么。如果我尝试将所有内容从https粘贴到浏览器的末尾,则不会出现任何问题。不知道如何从中获取有用的信息。
答案 0 :(得分:32)
收到数据意图时,您应该使用contentResolver来获取照片。 这是你应该做的:
String url = intent.getData().toString();
Bitmap bitmap = null;
InputStream is = null;
if (url.startsWith("content://com.google.android.apps.photos.content")){
is = getContentResolver().openInputStream(Uri.parse(url));
bitmap = BitmapFactory.decodeStream(is);
}
答案 1 :(得分:1)
我确实遇到了从新的Google相册应用中选择图片的问题。我能够通过以下代码解决它。
它适用于我,基本上我所做的是我正在检查内容URI中是否存在权限。如果它在那里我写入临时文件并返回该临时图像的路径。您可以在写入临时图像时跳过压缩部分
public static String getImageUrlWithAuthority(Context context, Uri uri) {
InputStream is = null;
if (uri.getAuthority() != null) {
try {
is = context.getContentResolver().openInputStream(uri);
Bitmap bmp = BitmapFactory.decodeStream(is);
return writeToTempImageAndGetPathUri(context, bmp).toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
public static Uri writeToTempImageAndGetPathUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
P.S。 :我已经回答了similar question here
答案 2 :(得分:0)
您必须使用投影才能获得ImageColumns.DATA
(或MediaColumns.DATA
):
private String getRealPathFromURI(Uri contentURI) {
// Projection makes ContentResolver to get needed columns only
String[] medData = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(contentURI, medData, null, null, null);
// this is how you can simply get Bitmap
Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), contentURI);
// After using projection cursor will have needed DATA column
cursor.moveToFirst();
final int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}