最近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から最後まですべてを貼り付けようとすると、何も表示されません。これから使用可能な情報を取得する方法がわかりません。
データインテントを受け取るときは、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);
}
新しい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);
}
追伸:私は 同様の質問にここで答えました
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);
}