Seleccione la imagen de la galería en Android Fragment
Quiero seleccionar la intención de la galería en el fragmento.cuando el usuario elige la opción para seleccionar la imagen de la galería, entonces la galería se abre y inmediatamente se llama onActivityResult de fragmento.y cuando el usuario escoge la imagen, a continuación, onActivityResult () no se llama.Así que no puedo seleccionar Imagen de la galería. Belo es mi código para abrir la galería –
Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("video/, images/"); startActivityForResult(intent, 2);
Y aquí está mi onActivityResult-
- Lista todas las imágenes de la tarjeta SD.
- Galería de Android fullscreen
- Identificar en onActivityResult si se seleccionó la imagen de una galería o un video - Android
- Selecciona la imagen de la galería que no funciona en Fragment Class en Android
- Elegir una foto de la galería y mostrarla en una vista de imagen
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult"); // not printed Toast.makeText(mContext, "aaaa"+requestCode, Toast.LENGTH_SHORT).show(); }
Cuál es el problema en mi código.
Gracias por adelantado.
- Cargar foto en la galería como objeto de mapa de bits en Android
- Desplazamiento automático de un widget Galería
- Obtener la extensión de archivo de imágenes seleccionadas de galería o cámara, como cadena
- Obtener ruta de acceso y nombre de archivo de la imagen de galería seleccionada en Android
- Difícil propagación de eventos táctiles entre vistas
- Cómo ocultar fotos de la galería y guardarlas en mi aplicación
- Android ¿Cómo recupero la foto de picasa desde la galería incorporada?
- CoverFlow que extiende Galería (obsoleto no funciona correctamente en dispositivos> 4,0)
# Te estoy mostrando un ejemplo en el que utilicé un ImageView para mostrar el resultado de la imagen. Hay dos métodos utilizados 1.Desde la cámara y 2.Desde la tarjeta SD #
public void camera(View view) { Log.i("SonaSys", "startCameraActivity()"); File file = new File(path); Uri outputFileUri = Uri.fromFile(file); Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, 0); } public void gallery(View view) { String path = Environment.getExternalStorageDirectory() + "/images/imagename.jpg"; Intent i = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != 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]); String picturePath = cursor.getString(columnIndex); cursor.close(); bitmap = BitmapFactory.decodeFile(picturePath); image.setImageBitmap(bitmap); if (bitmap != null) { ImageView rotate = (ImageView) findViewById(R.id.rotate); rotate.setVisibility(View.VISIBLE); } } else { Log.i("SonaSys", "resultCode: " + resultCode); switch (resultCode) { case 0: Log.i("SonaSys", "User cancelled"); break; case -1: onPhotoTaken(); break; } } } protected void onPhotoTaken() { // Log message Log.i("SonaSys", "onPhotoTaken"); taken = true; imgCapFlag = true; BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 4; bitmap = BitmapFactory.decodeFile(path, options); image.setImageBitmap(bitmap); }
Use esto para abrir el selector de imágenes de Android:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), GALLERY_INTENT_CALLED); } else { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("image/*"); startActivityForResult(intent, GALLERY_KITKAT_INTENT_CALLED); }
Y para onActivityResult
utilice esto:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); Cursor cursor = null; if (resultCode != Activity.RESULT_OK) return; if (data == null) return; Uri originalUri = null; if (requestCode == GALLERY_INTENT_CALLED && data != null) { originalUri = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; cursor = getActivity().getContentResolver().query(originalUri, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); filePath = cursor.getString(columnIndex); cursor.close(); Log.d("path of uri", filePath); } else if (requestCode == GALLERY_KITKAT_INTENT_CALLED && data != null) { originalUri = data.getData(); final int takeFlags = data.getFlags() & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // Check for the freshest data. getActivity().getContentResolver().takePersistableUriPermission( originalUri, takeFlags); Log.d("Uri: ", originalUri.toString()); filePath = getPath(getActivity(), originalUri); Log.d("filepath", filePath); } } @SuppressLint("NewApi") 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 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; } /** * @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()); }
Utilizar este código para elegir la imagen,
Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select image"), PICK_IMAGE);
Como Activity obtiene el resultado de onActivityResult (), necesitará anular el onActivityResult de la actividad () y llamar a super.onActivityResult () para propagarse al fragmento respectivo para los códigos de resultados no controlados o para todos.
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); }
Para ayudar a otros que están luchando con este error, le sugiero lo siguiente:
1. El modo de inicio de la actividad de su fragmento
Si el modo de inicio de su actividad es "singleInstance", en ese caso el onActivityResult se llamará automáticamente una vez que abandone la actividad y vaya a la actividad en la que se supone que escoge la imagen. Esto es cierto para la intención de la cámara también. Trate de cambiar su modo de lanzamiento a "singleTop" o cualquier cosa como una alternativa al modo de lanzamiento que tiene ahora mismo. De esta manera lo que sucederá será que su activityOnResult se llamará sólo cuando termine de recoger la imagen. También el resultado será volver al fragmento sólo desde donde se ha denominado startActivityForResult. Le sugeriré que considere implementar el diálogoFragmento para dar opción al usuario para recoger la imagen o hacer clic en la imagen
2. ¿Cómo ha llamado a la startActivityForResult
Su otra cosa interesante, si llamas a tu startActivityResult del fragmento usando el contexto local del fragmento, el resultado será devuelto al fragmento, pero si lo llamas usando el contexto de la actividad del fragmento como getActivity (). StartActivityResult el resultado será pasado de vuelta A la actividad del fragmento padre. Así que depende de donde usted quiere manejarlo. Otra cosa importante, llame a la
Super.onActivityResult (requestCode, resultCode, data);
En su método donde está obteniendo el resultado. Aparte de estos intentar seguir la sugerencia de que otro ha proporcionado para recoger la imagen con la intención adecuada.
- ¿Cambiar el ancho del cajón en Android por peso?
- Necesito llamar a un número perticular en los contactos