studio best app android photo-gallery

best - Elige foto de la galería en Android 5.0



gallery app android 8 (2)

Encontré solución a este problema combinando los siguientes métodos. Aquí para comenzar la actividad para elegir una imagen de la galería del dispositivo:

private void takePictureFromGallery() { startActivityForResult( Intent.createChooser( new Intent(Intent.ACTION_GET_CONTENT) .setType("image/*"), "Choose an image"), PICK_FROM_FILE); }

Aquí para manejar el resultado de la intención, como se describe en esta post , tenga en cuenta que la función getPath() funciona de manera diferente desde la versión de compilación de Android:

private void handleGalleryResult(Intent data) { Uri selectedImage = data.getData(); mTmpGalleryPicturePath = getPath(selectedImage); if(mTmpGalleryPicturePath!=null) ImageUtils.setPictureOnScreen(mTmpGalleryPicturePath, mImageView); else { try { InputStream is = getContentResolver().openInputStream(selectedImage); mImageView.setImageBitmap(BitmapFactory.decodeStream(is)); mTmpGalleryPicturePath = selectedImage.getPath(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } @SuppressLint("NewApi") private String getPath(Uri uri) { if( uri == null ) { return null; } String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor; if(Build.VERSION.SDK_INT >19) { // Will return "image:x*" String wholeID = DocumentsContract.getDocumentId(uri); // Split at colon, use second item in the array String id = wholeID.split(":")[1]; // where id is equal to String sel = MediaStore.Images.Media._ID + "=?"; cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection, sel, new String[]{ id }, null); } else { cursor = getContentResolver().query(uri, projection, null, null, null); } String path = null; try { int column_index = cursor .getColumnIndex(MediaStore.Images.Media.DATA); cursor.moveToFirst(); path = cursor.getString(column_index).toString(); cursor.close(); } catch(NullPointerException e) { } return path; }

  • Se invoca takePictureFromGallery() desde onActivityResult

¡¡Eso es todo!!

Encuentro un problema al elegir imágenes de la galería con Android 5.0. Mi código para la intención de inicio es:

private void takePictureFromGallery() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI); startActivityForResult(intent, PICK_FROM_FILE); }

y aquí hay una función llamada en el método onActivityResult () para el código de solicitud PICK_FROM_FILE

private void handleGalleryResult(Intent data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); // field declaration private String mTmpGalleryPicturePath; mTmpGalleryPicturePath = cursor.getString(columnIndex); cursor.close(); // at this point mTmpGalleryPicturePath is null ... }

Para versiones anteriores a 5.0, este código siempre funciona, utilizando la aplicación com.android.gallery. Google Photos es la aplicación predeterminada de la galería en Android 5.0. ¿Podría ser que este problema depende de la aplicación o es un problema de la nueva distribución del sistema operativo Android?

EDITAR

Entiendo el problema: Google Photos explora automáticamente el contenido de sus imágenes de copia de seguridad en el servidor en la nube. De hecho, estoy probando la práctica sugerida por @maveň si desactivo cada conexión a Internet y después de elegir una imagen, no se obtiene ningún resultado al decodificar Bitmap de InputStream.

Entonces, en este punto, la pregunta es: ¿existe una forma en Android 5.0 de manejar la acción Intent.ACTION_PICK para que la exploración del sistema elija en la galería de imágenes del dispositivo local?


Prueba esto:

//5.0 Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, CHOOSE_IMAGE_REQUEST);

Use lo siguiente en el onActivityResult:

Uri selectedImageURI = data.getData(); input = c.getContentResolver().openInputStream(selectedImageURI); BitmapFactory.decodeStream(input , null, opts);

Actualizar

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Uri selectedImageUri = data.getData(); String tempPath = getPath(selectedImageUri); /** * helper to retrieve the path of an image URI */ public String getPath(Uri uri) { if( uri == null ) { return null; } String[] projection = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(uri, projection, null, null, null); if( cursor != null ){ int column_index = cursor .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); cursor.moveToFirst(); return cursor.getString(column_index); } return uri.getPath(); } } }

tempPath almacenará la ruta de la ImageSelected

Comprueba esto para más detalles.