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:
- Enviar texto a un contacto específico (whatsapp)
- Hacer ArrayList de objetos personalizados parcelable
- Intentos de Android: Inicia la actividad usando el nombre de clase de otra aplicación que tiene el mismo sharedUserId
- Cómo abrir un álbum en la aplicación Galería con una intención
- ¿Cómo usar intenciones para ver datos de calendario?
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);
- Filtro de intenciones para iniciar mi actividad cuando se hace clic en el URI personalizado
- El programa no funciona después de la pantalla de bienvenida en android
- ¿Cómo almacenar permanentemente objeto personalizado parcelable?
- Cómo eliminar o editar el evento de G-calendario de mi aplicación Android?
- ¿No puedes configurar tanto FLAG_ACTIVITY_SINGLE_TOP como FLAG_ACTIVITY_CLEAR_TOP en una intención?
- ¿Se mantiene la intención de crear una actividad?
- Seguimiento correcto de referencias de instalación en Play Store
- Anidado Parcelling: RuntimeException - Unmarshalling tipo desconocido código 3211319 en el desplazamiento 440
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.