Excepción de puntero nulo en la intención de la cámara cuando elijo una cámara de terceros

Mi problema es que cada vez que elijo la aplicación de cámara de terceros, por ejemplo, Beauty Plus Cámara tengo una excepción de puntero nulo cada vez, mi código está funcionando por completo para la aplicación de cámara por defecto que incluso funciona con la nueva cámara de Google para los teléfonos de la serie moto.

El diálogo de primera vez para elegir la opción de galería o cámara está aquí:

private void OpenDialogForImage() { final CharSequence[] items = { "Gallary", "Camera", "Cancel" }; AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setItems(items, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int item) { // Do something with the selection switch (item) { case 0: Intent intent1 = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent1.setType("image/*"); startActivityForResult( Intent.createChooser(intent1, "Select File"), SELECT_FILE); break; case 1: Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_CAMERA); break; case 2: break; } } }); AlertDialog alert = builder.create(); alert.show(); } 

Este es el método OnActivityResult ():

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == Sponser_key && resultCode == Activity.RESULT_OK) { String sSponsors = data.getStringExtra("Sponsors"); if (sSponsors != null) sponsorsResp = new Gson().fromJson(sSponsors, GetSponsorsResp.class); } else if (requestCode == REQUEST_CAMERA) { if (resultCode == activity.RESULT_OK) { Bitmap photo = (Bitmap) data.getExtras().get("data"); ivProfile.setImageBitmap(photo); // CALL THIS METHOD TO GET THE URI FROM THE BITMAP Uri tempUri = Other.getImageUri(activity, photo); file = new File(Other.getRealPathFromURI(activity, tempUri)); } else { /** * not select any image */ } } else if (requestCode == SELECT_FILE) { if (resultCode == activity.RESULT_OK) { Uri selectedImageUri = data.getData(); ivProfile.setImageURI(selectedImageUri); file = new File(Other.getPath(activity, selectedImageUri)); } } } 

Este código anterior es la nota de trabajo para algunas aplicaciones de terceros como he mencionado antes. Estoy recibiendo NullPointerException en esta línea: Bitmap photo = (Bitmap) data.getExtras (). Get ("data");

Si desea aprovechar las aplicaciones de terceros, no habrá una solución perfecta, ya que no están obligados a seguir el mismo contrato que la aplicación de cámara Android estándar. Pero probablemente puede obtener mejores resultados que ahora.

La aplicación de cámara estándar cumple este contrato:

  1. Devuelve una imagen en miniatura en intent.getExtras.get("data")
  2. Si proporciona un Uri con intent.putExtra(MediaStore.EXTRA_OUTPUT, uri) , guardará la imagen de tamaño completo en esta ubicación.

(Ver el artículo de entrenamiento para detalles importantes.)

Aunque la aplicación de cámara de terceros que intentó no cumple con la parte 1 del contrato, es posible que tenga mejor suerte con la parte 2.

Y dada la imagen de tamaño completo, la creación de la miniatura que aparentemente necesita no es demasiado difícil, por ejemplo, utilizando respuestas aquí en Desbordamiento de pila.

Busque en este archivo: https://github.com/iPaulPro/aFileChooser/blob/master/aFileChooser/src/com/ipaulpro/afilechooser/utils/FileUtils.java

Intente usar esto:

 File mPhotoFile = FileUtils.getFile(context,data.getData()); 

Que devuelven el archivo.

Este es un problema con el uso de aplicaciones externas para manejar la funcionalidad para usted. En teoría, las aplicaciones que aceptan acciones de Intent deben manejar correctamente la Intent y devolver los datos que está pidiendo, pero en la práctica hay muy poco que puede hacer para imponer este comportamiento … Por ejemplo, cualquier aplicación puede decir que maneja " Captura ", pero si tuviera que pasar su Intent a una aplicación mal programada o maliciosa, no hay nada que impida que la aplicación de hacer algo completamente diferente de lo que pretendía, o nada en absoluto. Si decide dejar que su aplicación abandone el control de otra aplicación para cumplir con ciertas funciones, se arriesga a que cualquier aplicación que se elija no pueda satisfacer esa funcionalidad.

En realidad son muy pocas opciones para asegurarse siempre de que su aplicación tomará una imagen de la manera que desee:

  • Crear un selector para su Intent cámara y limitar los resultados a sólo las aplicaciones que ha probado y saber el trabajo como se pretende. Si las aplicaciones particulares no están instaladas, inhabilite la función de toma de fotografías.
  • Implemente la captura de imágenes.
  • Android.app.Application no se puede instanciar debido a NullPointerException
  • Usando secciones con fragmentos, NullPointerException
  • Error al entregar el resultado ResultInfo
  • Android - ¿Cómo anular el botón "Atrás" para que no termine () mi actividad?
  • SQLiteDatabase close () función que causa NullPointerException cuando varios subprocesos
  • ¿Qué es una NullPointerException y cómo puedo solucionarlo?
  • MapView - Android
  • La galería onItemClick y onTouchEvent no funcionan juntas desde la versión android 3.0
  • NullPointerException: Intento de leer del campo 'int android.view.View.mViewFlags'
  • NullPointerException en la reflexión durante el arranque de Robolectric - cualquier sugerencias?
  • ¿Por qué el servicio Android falla con NullPointerException?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.