Загрузить изображение из нового приложения Google+ (плюс) Фото
Недавно Google добавил приложение "Фото" для Google+ (плюс), и оно появляется, когда вы запускаете Intent для выбора изображения. Однако, если я выберу изображение из Google+ Photos и попытаюсь использовать его в своем приложении, ни одна из моих нынешних логик не сможет вернуть используемый 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
информация всегда возвращает ноль и MediaColumns.DISPLAY_NAME
всегда возвращает image.jpg независимо от того, что я выбираю из приложения Google Фото. Если я попытаюсь вставить в браузер все, от https до конца, ничего не появится. Не уверен, как получить полезную информацию из этого.
3 ответа
При получении данных намерения, вы должны использовать 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. Если это так, я пишу во временный файл и возвращаю путь этого временного изображения. Вы можете пропустить часть сжатия во время записи во временное изображение
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: я ответил на аналогичный вопрос здесь
Вы должны использовать проекцию, чтобы получить 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);
}