android - para - Elegir una foto con la nueva aplicación Google Photos está roto
google fotos app (2)
El siguiente código también funciona para mí para obtener el URI de contenido en las últimas fotos de Google. Lo que he intentado es escribir en el archivo temporal y devolver el URI de la imagen temporal, si tiene autoridad en el URI de contenido.
Puedes probar lo mismo:
private 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
{
if (is != null)
{
is.close();
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
return null;
}
private 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);
}
Mi aplicación tiene la capacidad de seleccionar una foto de la biblioteca. Exactamente quiero ruta de archivo de esta selección.
Este es el código para crear la intención de seleccionar una foto:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, INTENT_REQUEST_CODE_SELECT_PHOTO);
Este es el código que obtiene la ruta del archivo desde URI:
Cursor cursor = null;
String path = null;
try {
String[] projection = { MediaStore.Images.Media.DATA };
cursor = context.getContentResolver().query(contentUri, projection, null, null, null);
int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);
cursor.moveToFirst();
path = cursor.getString(columnIndex);
} finally {
if (cursor != null) {
cursor.close();
}
}
return path;
Antes de la actualización de ayer de la aplicación Google Photos, todo funcionaba perfectamente bien.
Ahora la
path
es nula después de analizar el URI.
URI es similar a esto:
content://com.google.android.apps.photos.contentprovider/0/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209/ACTUAL
También intenté crear intención con la acción Intent.ACTION_GET_CONTENT, sin suerte.
Sin duda, esta es una solución, pero podría extraer el URI de contenido real que aparentemente se ha incrustado por alguna razón:
content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F75209
Pude crear un nuevo URI con
authority=media and path=external/images/media/xxx
, y el solucionador de contenido devolvió una URL real.
Código de ejemplo:
String unusablePath = contentUri.getPath();
int startIndex = unusablePath.indexOf("external/");
int endIndex = unusablePath.indexOf("/ACTUAL");
String embeddedPath = unusablePath.substring(startIndex, endIndex);
Uri.Builder builder = contentUri.buildUpon();
builder.path(embeddedPath);
builder.authority("media");
Uri newUri = builder.build();