Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Puntero nulo después de capturar la imagen usando la cámara con Android

En mi aplicación, estoy usando la cámara de dispositivos Android para capturar una imagen. Para algunos dispositivos funciona bien, pero algunos no lo son. Acabo de probarlo en LG nexus 4 E960, después de que capturó la imagen de mi aplicación se estrelló sin poder guardar el resultado. Este es mi código

//Using intent to open camera Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent,CAMERA_CAPTURE); 

En la actividadResultado:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode==RESULT_OK) { if(requestCode==CAMERA_CAPTURE) { Bitmap pictTaken = null ; Bundle extras = data.getExtras(); if(extras.keySet().contains("data")) { pictTaken = (Bitmap) extras.get("data"); picUri = getIntent().getData(); } else{ picUri = getIntent().getData(); try { pictTaken = decodeUri(picUri); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Intent cropIntent= new Intent (this, Crop.class); cropIntent.putExtra("data", picUri.toString()); cropIntent.putExtra("pict", pictTaken); cropIntent.putExtra("code","camera"); startActivity(cropIntent); } } 

Después de capturado y guardarlo, la imagen muestra en la siguiente actividad llamada Crop.class aquí es mi logcat

  12-12 13:26:36.340: E/AndroidRuntime(23575): FATAL EXCEPTION: main 12-12 13:26:36.340: E/AndroidRuntime(23575): Process: com.example.cobaandroid, PID: 23575 12-12 13:26:36.340: E/AndroidRuntime(23575): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.example.cobaandroid/com.example.cobaandroid.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.app.ActivityThread.deliverResults(ActivityThread.java:3368) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3411) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.app.ActivityThread.access$1300(ActivityThread.java:138) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.os.Handler.dispatchMessage(Handler.java:102) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.os.Looper.loop(Looper.java:136) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.app.ActivityThread.main(ActivityThread.java:5050) 12-12 13:26:36.340: E/AndroidRuntime(23575): at java.lang.reflect.Method.invoke(Native Method) 12-12 13:26:36.340: E/AndroidRuntime(23575): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779) 12-12 13:26:36.340: E/AndroidRuntime(23575): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595) 12-12 13:26:36.340: E/AndroidRuntime(23575): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.net.Uri.toString()' on a null object reference 12-12 13:26:36.340: E/AndroidRuntime(23575): at com.example.cobaandroid.MainActivity.onActivityResult(MainActivity.java:226) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.app.Activity.dispatchActivityResult(Activity.java:5433) 12-12 13:26:36.340: E/AndroidRuntime(23575): at android.app.ActivityThread.deliverResults(ActivityThread.java:3364) 12-12 13:26:36.340: E/AndroidRuntime(23575): ... 9 more 

Tengo un problema para abrir / utilizar la cámara que funcionan en la mayoría de los dispositivos Android, el objetivo principal de este proyecto depende en gran medida el uso de la cámara. Por favor, dame tu ayuda, gracias ..

  • Problema para recuperar ConnectivityManager en un dispositivo con multi sim
  • NullPointerException de getExtras ()
  • IabHelper error de Android (NullPointerException) launchPurchaseFlow?
  • Android.app.Application no se puede instanciar debido a NullPointerException
  • Mi ubicación actual siempre devuelve null. ¿Cómo puedo arreglar esto?
  • Reciclar vista - java.lang.NullPointerException
  • Android - ¿Cómo anular el botón "Atrás" para que no termine () mi actividad?
  • Excepción de puntero nulo de SQLite de SQLite
  • 8 Solutions collect form web for “Puntero nulo después de capturar la imagen usando la cámara con Android”

    Intente debajo del código,

      Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); File file=getOutputMediaFile(1); picUri = Uri.fromFile(file); // create i.putExtra(MediaStore.EXTRA_OUTPUT,picUri); // set the image file startActivityForResult(i, CAPTURE_IMAGE); 

    Donde getOutputMediaFile (int) será,

     /** Create a File for saving an image */ private File getOutputMediaFile(int type){ File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyApplication"); /**Create the storage directory if it does not exist*/ if (! mediaStorageDir.exists()){ if (! mediaStorageDir.mkdirs()){ return null; } } /**Create a media file name*/ String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile; if (type == 1){ mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_"+ timeStamp + ".png"); } else { return null; } return mediaFile; } 

    y finalmente,

     @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK) { Intent i; switch (requestCode) { case CAPTURE_IMAGE: //THIS IS YOUR Uri Uri uri=picUri; break; } } } 

    Aclamaciones….:)

    Para aquellos que no pudieron resolver este problema con ninguna de las respuestas aquí, aquí está el camino.

    Tiene un miembro picUri en el que guarda el archivo de imagen temporal URI antes de startActivityForResult el startActivityForResult para iniciar la aplicación Cámara.

    Cuando la aplicación se detiene, esta información podría perderse (como en mi caso) y lo encontrará como null cuando regrese a la actividad para usarla para obtener la imagen guardada de la cámara.

    Entonces, obtendrá NullPointerException .

    La forma correcta de guardar picUri es guardarla en onSaveInstanceState(Bundle) y restaurarla onRestoreInstanceState(Bundle) para evitar la pérdida de información.

    Aquí está cómo hacerlo:

     // Save the activity state when it's going to stop. @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable("picUri", picUri); } // Recover the saved state when the activity is recreated. @Override protected void onRestoreInstanceState(@NonNull Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); picUri= savedInstanceState.getParcelable("picUri"); } 

    Me dio un dolor de cabeza durante dos horas.

    reemplazar

     picUri = getIntent().getData(); 

    con

     picUri = data.getData(); 

    Y prueba una vez …

    Usted tiene que decirle a la cámara para guardar el camino de la imagen como a continuación:

     Uri picUri; Intent intentAmbil = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/picture.jpg"; File imageFile = new File(imageFilePath); picUri = Uri.fromFile(imageFile); // convert path to Uri intentAmbil.putExtra( MediaStore.EXTRA_OUTPUT, picUri ); startActivityForResult(intentAmbil, REQUEST_MAKE_PHOTO); @Override public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { switch (requestCode) { case REQUEST_MAKE_PHOTO: if (resultCode == Activity.RESULT_OK) { // do something with mMakePhotoUri } return; default: // do nothing super.onActivityResult(requestCode, resultCode, data); } } 

    Prueba éste

     if (resultCode != RESULT_CANCELED) { if (requestCode == CAMERA_REQUEST && resultCode == Activity.RESULT_OK) { if (requestCode == CAMERA_REQUEST) { if (data != null) { Bitmap photo = (Bitmap) data.getExtras().get("data"); imageView.setImageBitmap(photo); } } } Drawable drawable = imageView.getDrawable(); if (drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable; bitmap1 = bitmapDrawable.getBitmap(); } } } if (bitmap1 != null) { bitmap1 = Bitmap.createScaledBitmap(bitmap1, 512, 512, false); imageView.setImageBitmap(bitmap1); @SuppressWarnings("unused") String path = SaveImage_Sta(bitmap1, "stat"); } else { Log.i("bitmap............", "bitmap1 is null"); } 

    En algunos dispositivos onActivityResult se llama no en la actividad reanudar en lugar de la actividad se reinicia después de la devolución de llamada de intención de la cámara, por lo que picurl puede ser nulo de nuevo – podemos utilizar la clase de aplicación para mantener la referencia de la variable

    Podemos crear nuestra propia clase de aplicación

    1.en android manifiesto tenemos que Especificar la clase de aplicación que vamos a utilizar

      <application android:name=".MyApplication" > <activity ........ > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity> .... </activity> .... </application> 

    2.Crear la clase de aplicación

     public class MyApplication extends Application { private Uri picUri; public void getPicUri() { return picUri; } public void setPictUri(Uri auri) { picUri = aUri; } } 

    3.Inside el uso de la actividad

      //call the camera intent and pass the created a tempfile uri and use the tempfile uri MyApplication myApplication = (MyApplication)getApplication(); myApplication.setPictUri(aUri); .... .... public void onActivityResult(final int requestCode, final int resultCode, final Intent data) { switch (requestCode) { case REQUEST_MAKE_PHOTO: if (resultCode == Activity.RESULT_OK) { // do something with mMakePhotoUri MyApplication myApplication = (MyApplication)getApplication(); myApplication.getPicUri();// use the pic uri } return; default: // do nothing super.onActivityResult(requestCode, resultCode, data); } } 

    Tengo el mismo problema en mi aplicación. El problema es que cuando onActivityResult se ejecuta, los datos son nulos por lo que no se puede obtener nada de la actividad de la cámara. Debería haber otra manera de resolver esto en lugar de usar la clase Application, porque se complica mucho cuando manejas más de una foto.

    Ver He hecho una cosa más puede ser que le ahorrará su tiempo. La cosa es que el objeto de datos en onActivityResult () es el contenido principal a considerar. El objeto de datos está siendo nulo cuando se trata de operar el p = código para el siguiente movimiento. Lo que harás es simplemente poner la condición if-else en eso y ejecutar tu proyecto.

     protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(data !=null){ if(resultCode==RESULT_OK) { if(requestCode==CAMERA_CAPTURE) { Bitmap pictTaken = null ; Bundle extras = data.getExtras(); if(extras.keySet().contains("data")) { pictTaken = (Bitmap) extras.get("data"); picUri = getIntent().getData(); } else{ picUri = getIntent().getData(); try { pictTaken = decodeUri(picUri); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Intent cropIntent= new Intent (this, Crop.class); cropIntent.putExtra("data", picUri.toString()); cropIntent.putExtra("pict", pictTaken); cropIntent.putExtra("code","camera"); startActivity(cropIntent); } } }else{ //on cancel event or something else you want to do } } 

    Compruebe esto, es fácil y hará su trabajo en un ir.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.