Problemas al trabajar con la cámara en onActivityResult

Tengo dos opciones "seleccionar foto" y "tomar foto" – Tengo mi funcionalidad de foto seleccionada trabajando, pero teniendo problemas con la toma de una foto. Principalmente tener la imagen guardada en la pantalla de mi imagen, después de haber sido guardado.

Definido mi ubicación de la foto:

public class photoActivity extends Activity { private String photoPath; private ImageView imgView; {...} 

Mi oyente de cámara:

 bPicFromCam.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { long captureTime = System.currentTimeMillis(); photoPath = Environment.getExternalStorageDirectory() + "/MYAPP" + captureTime + ".jpg"; getPicFromCam(v); } else{ Toast.makeText(getApplicationContext(), "Sorry there is a problem accessing your SDCard, " + "please select a picture from your gallery instead.", Toast.LENGTH_LONG).show(); } } }); 

Entonces mi código para iniciar la intención de la cámara (tenga en cuenta que el photoPath es correcto):

  public void getPicFromCam(View view){ System.out.println("photoPath: " + photoPath); //Outputs the CORRECT location! try{ Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); File photo = new File(photoPath); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); imageUri = Uri.fromFile(photo); startActivityForResult(Intent.createChooser(intent, "Capture Image"), CAPTURE_IMAGE); } catch (Exception e) { Toast.makeText(getApplicationContext(), getString(R.string.exception_message), Toast.LENGTH_LONG).show(); Log.e(e.getClass().getName(), e.getMessage(), e); } } 

Aceptar todo parece bien hasta este punto – la imagen se toma y la imagen se guarda en la ubicación especificada.

Ahora estoy intentando exhibir la imagen en mi visión de la imagen (después puede ser uploaded después de que el usuario confirme su bueno).

Mi onActivityResult:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case PICK_IMAGE: if (resultCode == Activity.RESULT_OK) { //THIS WORKS } break; case CAPTURE_IMAGE: if (resultCode == RESULT_CANCELED) { Toast toast = Toast.makeText(this,"Canceled, no photo selected.", 1000); toast.show(); return; } if (requestCode == CAPTURE_IMAGE && resultCode == RESULT_OK) { try { System.out.println("photoPath " + photoPath); //This is NULL!!! And my problem, halp! BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = 6; bitmap = BitmapFactory.decodeFile(photoPath, bitmapOptions); imgView.setImageBitmap(bitmap); } catch (Exception e) { Toast.makeText(getApplicationContext(), "Internal error", Toast.LENGTH_LONG).show(); Log.e(e.getClass().getName(), e.getMessage(), e); } } break; default: } } 

Ésta es la manera que estoy intentando actualmente, pero también he intentado usar el siguiente en mi onActivityResult:

 bitmap = (Bitmap) data.getExtras().get("data"); 

Pero cada vez que intento y la variación del método anterior consigo un NPE.

EDITAR:

  03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): null 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): java.lang.NullPointerException 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at com.myco.photoapp.SelectPhoto.onActivityResult(SelectPhoto.java:277) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.Activity.dispatchActivityResult(Activity.java:3890) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.deliverResults(ActivityThread.java:3511) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3115) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2684) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.os.Handler.dispatchMessage(Handler.java:99) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.os.Looper.loop(Looper.java:123) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at android.app.ActivityThread.main(ActivityThread.java:4627) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at java.lang.reflect.Method.invokeNative(Native Method) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at java.lang.reflect.Method.invoke(Method.java:521) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 03-11 19:28:56.319: ERROR/java.lang.NullPointerException(16391): at dalvik.system.NativeStart.main(Native Method) 

Por encima de NPE viene cuando:

 //below is line 277 String result = data.toURI(); BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); bitmapOptions.inSampleSize = 6; bitmap = BitmapFactory.decodeFile(result, bitmapOptions); 

Es probable que tu actividad se destruya y vuelva a crear cuando la actividad de la cámara se está apagando. Tal vez intente guardar photoPath en el Bundle en onSaveInstanceState y luego pescarlo de nuevo en onCreate (asegúrese de comprobar si hay nulls en onCreate cuando lo haga)?

No puedo usar los datos. Pero creo que usted necesita cambiado como sigue

Foto para convertirse en variable general.

 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); 

Por lo tanto, debe tomarlo de esta carpeta:

 Bitmap photo = Media.getBitmap(getContentResolver(), Uri.fromFile(photo) ); 

Sigo tu código y cambio.

Básicamente poner, usando

 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photo)); 

funciona bien

Antes de colocar en una imageView, asegúrese de que comprime la imagen ya que es muy grande al guardar esta manera.

 int newWidth = bm.getWidth(); int newHeight = bm.getHeight(); while(newWidth > 300){ newWidth = newWidth/2; newHeight = newHeight/2; } mImagePlaceHolder.setImageBitmap(Bitmap.createScaledBitmap(bm, newWidth, newHeight, false)); 

He luchado con este problema y he encontrado otra solución: solo usa código como este:

 Bitmap bitmap = data.getExtras().getParcelable("data"); 

Y puede obtener el mapa de bits.

  • No se puede pasar el objeto personalizado en un intento: El método Poner extra es ambiguo para el tipo Intención
  • NullPointerException mientras se envía StringArray usando Parcelable
  • Abrir el navegador nativo de una aplicación de Android
  • Cómo pasar ArrayList de objetos de una a otra actividad utilizando Intent en android?
  • Android: problema con objeto Serializable puesto en intención
  • Mostrar el calendario en la vista de mes con la intención
  • Boolean se restablece a false cuando getExtra se llama
  • ¿Por qué es nulo el objeto parcelable en la actividad de recepción?
  • getParcelable devuelve null incluso si el objeto pasado no es null
  • Cómo abrir la galería a través de la intención sin resultado
  • Intención para obtener múltiples imágenes
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.