samsung recuperar las google fotos eliminar desinstalar como android android-intent android-contentprovider

android - recuperar - picasa web google



Obtener una imagen de Gallery desde las carpetas sincronizadas de Picasa// Google+no funciona (7)

Estoy tratando de obtener una imagen de la aplicación de la galería desde una de las carpetas de las fotos sincronizadas de Google+. Después de seleccionar la imagen, el Uri se devuelve correctamente. Pero cuando trato de obtener la ruta real de esa imagen en el dispositivo de almacenamiento, para poder usarla, se bloquea. El problema parece ser específicamente con el proveedor de contenido picasa .

Probado en Nexus S y Nexus 7, y otros dispositivos también.

E/AndroidRuntime(14572): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.google.android.gallery3d.provider/picasa/item/5427003652908228690 }}

Aquí, el campo dat parece estar pasando correctamente el Uri, pero cuando trato de recuperar la ubicación de la imagen, se bloquea con el siguiente error.

W/GalleryProvider(14381): unsupported column: _data

Parece que el proveedor de contenido para álbumes de Picasa no tiene un campo _data.

El código para obtener la ubicación es:

// imageUri is the Uri from above. String[] proj = { MediaStore.Images.Media.DATA }; Cursor cursor = context.getContentResolver().query(imageUri, proj,null, null, null); int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); String filePath = cursor.getString(column_index); cursor.close();

Las únicas columnas que parecen admitidas para esta imagen son: [user_account, picasa_id, _display_name, _size, mime_type, datetaken, latitude, longitude, orientation]

¿Cómo obtenemos la ubicación real de esta imagen? Y si no se supone que debemos trabajar con esta imagen, estas imágenes no deberían mostrarse al usuario en primer lugar.

La intención de iniciar la aplicación de la galería es:

Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT);


Debajo del truco funcionó para mí, lo que estoy haciendo aquí es si hay alguna url de autoridad en el URI, entonces estoy creando una imagen temporal usando el código a continuación y devolviendo el URI de contenido del mismo.

He respondido una pregunta similar aquí también ..

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


Después de mucha investigación, sentí que había demasiadas soluciones para hacer algo que parece ser bastante simple. Entonces, seguí adelante y escribí una pequeña biblioteca que maneja todo el complejo si es necesario y funciona para todos los escenarios posibles que se me ocurren. Pruébalo y mira si esto ayuda.

http://techdroid.kbeanie.com/2013/03/easy-image-chooser-library-for-android.html

Esta es una implementación inicial. A pesar de que maneja casi todas las situaciones, podría haber algunos errores. Si usa esta biblioteca, por favor déjenme saber sus comentarios y, en todo caso, podría mejorarse más.


Finalmente terminó con una solución clásica ... Al usar Document.util, que cubre todas las autorizaciones: -1-Inside your onActivityResult (): -

case GALLERY_CAPTURE_IMAGE_REQUEST_CODE: String filePath = DocumentUtils.getPath(MainContainerActivity.this,data.getData(); break;

2- Crear clase DocumentUtils: -

public class DocumentUtils { @TargetApi(Build.VERSION_CODES.KITKAT) public static String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } // TODO handle non-primary volumes } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[]{split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { // Return the remote address String url; if (isGooglePhotosUri(uri)) { url = getDataColumnWithAuthority(context, uri, null, null); return getDataColumn(context, Uri.parse(url), null, null); } return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * Function for fixing synced folder image picking bug * * **/ public static String getDataColumnWithAuthority(Context context, Uri uri, String selection, String[] selectionArgs) { Bitmap bitmap = null; InputStream is = null; if (uri.getAuthority()!=null){ try { is = context.getContentResolver().openInputStream(uri); } catch (FileNotFoundException e) { e.printStackTrace(); } Bitmap bmp = BitmapFactory.decodeStream(is); return ImageLoader.getImageUri(context,bmp).toString(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public static boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public static boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public static boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is Google Photos. */ public static boolean isGooglePhotosUri(Uri uri) { if(uri.getAuthority()!=null) return true; return false; }

}

3- También necesitarás la siguiente función en ImageLoader.java:-

public static Uri getImageUri(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); }


Me enfrenté al mismo problema hace un año ... Te muestro mi solución (el código es bastante complicado, por favor refactorícelo). Entonces, tienes el URI de la imagen que fue devuelto desde la galería:

ImageInfo getImage(URI imageUri) { ImageInfo result = null; final String[] cursorColumns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION}; // some devices (OS versions return an URI of com.android instead of com.google.android if (imageUri.toString().startsWith("content://com.android.gallery3d.provider")) { // use the com.google provider, not the com.android provider. imageUri = Uri.parse(imageUri.toString().replace("com.android.gallery3d","com.google.android.gallery3d")); } Cursor cursor = App.getContext().getContentResolver().query(imageUri, cursorColumns, null, null, null); if (cursor != null) { int dataColumnIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); int orientationColumnIndex = cursor.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION); cursor.moveToFirst(); // if it is a picasa image on newer devices with OS 3.0 and up if (imageUri.toString().startsWith("content://com.google.android.gallery3d")) { result = new ImageInfo(downloadImage(imageUri), "0"); } else { // it is a regular local image file result = new ImageInfo(cursor.getString(dataColumnIndex), cursor.getString(orientationColumnIndex)); } cursor.close(); } else { result = new ImageInfo(downloadImage(imageUri), "0"); } return result; }

Y ahora necesitamos la función para descargar la imagen:

private String downloadImage(URI imageUri) { File cacheDir; // if the device has an SD card if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { cacheDir = new File(android.os.Environment.getExternalStorageDirectory(),".OCFL311"); } else { // it does not have an SD card cacheDir = App.getContext().getCacheDir(); } if(!cacheDir.exists()) cacheDir.mkdirs(); File f = new File(cacheDir, PUT_HERE_FILE_NAME_TO_STORE_IMAGE); try { InputStream is = null; if (imageUri.toString().startsWith("content://com.google.android.gallery3d")) { is = App.getContext().getContentResolver().openInputStream(imageUri); } else { is = new URL(imageUri.toString()).openStream(); } OutputStream os = new FileOutputStream(f); Utils.InputToOutputStream(is, os); return f.getAbsolutePath(); } catch (Exception ex) { Log.d(this.getClass().getName(), "Exception: " + ex.getMessage()); // something went wrong ex.printStackTrace(); return null; } }

ImageInfo es mi clase para almacenar la ruta a la imagen y su orientación.

public static class ImageInfo { public final String filePath; public final String imageOrientation; public ImageInfo(String filePath, String imageOrientation) { this.filePath = filePath; if (imageOrientation == null) imageOrientation = "0"; this.imageOrientation = imageOrientation; } }


Perdí muchas horas y ahora encontré una solución que funciona en todos los casos sin ninguna descarga mágica en hilos especiales o algo así. El siguiente método devuelve una secuencia del contenido que el usuario seleccionó y esto funciona con todo en la naturaleza.

FileInputStream getSourceStream(Uri u) throws FileNotFoundException { FileInputStream out = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { ParcelFileDescriptor parcelFileDescriptor = mContext.getContentResolver().openFileDescriptor(u, "r"); FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor(); out = new FileInputStream(fileDescriptor); } else { out = (FileInputStream) mContext.getContentResolver().openInputStream(u); } return out; }


Según la respuesta @drindt, los códigos a continuación dan la ruta de File temporal descargada del File Google Photo sincronizado en la nube pero no en el dispositivo.

@SuppressLint("NewApi") public static String getFilePath(final Context context, final Uri uri) { // Google photo uri example // content://com.google.android.apps.photos.contentprovider/0/1/mediakey%3A%2FAF1QipMObgoK_wDY66gu0QkMAi/ORIGINAL/NONE/114919 if ("content".equalsIgnoreCase(uri.getScheme())) { String result = getDataColumn(context, uri, null, null); // if (TextUtils.isEmpty(result)) if (uri.getAuthority().contains("com.google.android")) { try { File localFile = createImageFile(context, null); FileInputStream remoteFile = getSourceStream(context, uri); if(copyToFile(remoteFile, localFile)) result = localFile.getAbsolutePath(); remoteFile.close(); } catch (IOException e) { e.printStackTrace(); } } return result; } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = { column }; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * Copy data from a source stream to destFile. * Return true if succeed, return false if failed. */ private static boolean copyToFile(InputStream inputStream, File destFile) { if (inputStream == null || destFile == null) return false; try { OutputStream out = new FileOutputStream(destFile); try { byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) >= 0) { out.write(buffer, 0, bytesRead); } } finally { out.close(); } return true; } catch (IOException e) { return false; } } public static String getTimestamp() { try { return new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.ROOT).format(new Date()); } catch (RuntimeException e) { return new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); } } public static File createImageFile(Context context, String imageFileName) throws IOException { if (TextUtils.isEmpty(imageFileName)) imageFileName = getTimestamp(); // make random filename if you want. final File root; imageFileName = imageFileName; root = context.getExternalCacheDir(); if (root != null && !root.exists()) root.mkdirs(); return new File(root, imageFileName); } public static FileInputStream getSourceStream(Context context, Uri u) throws FileNotFoundException { FileInputStream out = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(u, "r"); FileDescriptor fileDescriptor = null; if (parcelFileDescriptor != null) { fileDescriptor = parcelFileDescriptor.getFileDescriptor(); out = new FileInputStream(fileDescriptor); } } else { out = (FileInputStream) context.getContentResolver().openInputStream(u); } return out; }


Usé este enfoque, funciona bien para mí, espero que esto te ayude ...

ACTIVITYRESULT_CHOOSEPICTURE es la int que usa al llamar a startActivity (intent, requestCode);

public void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == ACTIVITYRESULT_CHOOSEPICTURE) { BitmapFactory.Options options = new BitmapFactory.Options(); final InputStream ist = ontext.getContentResolver().openInputStream(intent.getData()); final Bitmap bitmap = BitmapFactory.decodeStream(ist, null, options); ist.close(); } }

si el código anterior no funciona, solo remítese a este enlace ... será hosco muestra el camino

http://dimitar.me/how-to-get-picasa-images-using-the-image-picker-on-android-devices-running-any-os-version/