web-dev-qa-db-ja.com

新しいGoogle+(プラス)フォトアプリケーションから画像をダウンロード

最近Googleが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>

MediaColumns.DATA infoは常にnullを返し、MediaColumns.DISPLAY_NAME Googleフォトアプリから何を選択しても、常にimage.jpgを返します。ブラウザにhttpsから最後まですべてを貼り付けようとすると、何も表示されません。これから使用可能な情報を取得する方法がわかりません。

32
Jason

データインテントを受け取るときは、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);
}
32
HatemTmi

新しい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);
}

追伸:私は 同様の質問にここで答えました

1
Akhil

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