31

最近、Google は Google+ (plus) 用の写真アプリを追加し、画像を選択するインテントを起動すると表示されます。ただし、Google+ フォトから画像を選択してアプリケーションで使用しようとすると、現在のロジックでは使用可能な URI または URL を返して、ダウンロードして操作できる画像を実際に取得することはできません。私は現在、「一般的な」方法を使用して、スタック オーバーフローやその他の場所にある 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 から最後まですべて貼り付けようとしても、何も表示されません。これから使用可能な情報を取得する方法がわかりません。

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

You have to use projection in order to get ImageColumns.DATA (or 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 に答える