从新的Google+(加)照片应用程序下载图像

时间:2013-11-06 07:01:55

标签: android google-plus android-contentprovider google-photos

最近,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粘贴到浏览器的末尾,则不会出现任何问题。不知道如何从中获取有用的信息。

3 个答案:

答案 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);
}