31

最近谷歌为 Google+(加号)添加了照片应用程序,当你启动一个选择图像的意图时它就会显示出来。但是,如果我从 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>

无论我从 Google 照片应用程序中选择什么,该MediaColumns.DATA信息始终返回 null 并且始终返回 image.jpg。MediaColumns.DISPLAY_NAME如果我尝试在浏览器中粘贴从 https 到末尾的所有内容,则不会出现任何内容。不知道如何从中获取可用信息。

4

3 回答 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);
}
于 2013-11-07T12:11:33.177 回答
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);
}

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

于 2015-06-24T07:07:04.727 回答
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);
}
于 2015-10-02T10:35:00.967 回答