从新版Google+(Plus)照片应用程序下载照片

31

最近谷歌为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无论我从Google相册应用程序中选择什么,始终返回image.jpg。如果我尝试将https到末尾的所有内容粘贴到浏览器中,没有任何结果。不确定如何从中获取可用的信息。


我有同样的问题。我需要文件内容以及文件名/标题,但我得到的只是“null”... - m02ph3u5
3个回答

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

我之前在识别图像时已经有逻辑来处理这个问题了,但是我忘记在实际下载图像并创建文件的AsyncTask中添加if语句来处理它。一旦我加上了if语句,它就成功获取了图像。 - Jason
你成功让它工作了吗?对于图像,获取位图并将其保存到文件中会起作用。在这种情况下,你会如何处理视频? - Kumar Bibek
使用这种方法,有没有办法提取图像名称和其他元数据? - android_student
有些图像中 is 是空的。有人知道为什么吗? - rocknow

1

我在使用新版Google相册应用程序时遇到了选择图像的问题。我通过以下代码解决了这个问题。

这对我有用,基本上我的做法是检查内容URI中是否存在任何“authority”权限。如果存在,我会将其写入临时文件并返回该临时图像的路径。在写入临时图像时,您可以跳过压缩部分。

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

附注:我在这里回答了一个类似的问题


0

你必须使用投影(projection)才能获取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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接