Problemas para trabajar con la cámara en onActivityResult

Tengo dos opciones, “seleccionar foto” y “tomar foto”: tengo mi funcionalidad de foto seleccionada funcionando, pero tengo problemas para tomar una foto. Tener principalmente la visualización de la imagen guardada en mi vista de imagen, después de haber sido guardada.

Definí mi ubicación de foto:

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

Mi oyente de la 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(); } } }); 

Luego mi código para iniciar la intención de la cámara (tenga en cuenta que 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); } } 

Todo está bien hasta este punto: se toma la fotografía y la imagen se guarda en la ubicación especificada.

Ahora estoy tratando de mostrar la imagen en mi vista de imagen (luego puede cargarse después de que el usuario confirme que está bien).

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: } } 

Esa es la forma en que actualmente lo estoy intentando, pero también he intentado usar lo siguiente en mi onActivityResult:

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

Pero cada vez que bash y la variación del método anterior obtengo 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); 

Su actividad probablemente se destruya y vuelva a crearse cuando la actividad de la cámara se apaga. Tal vez intente guardar photoPath en el paquete en onSaveInstanceState y luego pescar nuevamente en onCreate (asegúrese de verificar null en onCreate cuando lo haga)?

No puedo usar los datos. Pero creo que necesitas cambiar como sigue

foto para convertirse en variable general.

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

Entonces, debes tomarlo desde 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 un imageView, asegúrese de comprimir la imagen, ya que es extremadamente grande cuando se guarda de 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)); 

Luché con este problema y encontré otra solución: simplemente use un código como este:

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

y puedes obtener el bitmap.