new - Android startCamera me da Intento nulo y... ¿destruye mi variable global?
new intent kotlin android (2)
Tengo el siguiente problema:
cuando trato de iniciar mi cámara, puedo tomar la foto, incluso guardarla en mi tarjeta sd, pero cuando obtengo la ruta para mostrarla en mi dispositivo recibo errores.
Mis variables globales son 2 (utilicé 1 pero 2 son mejores para asegurarme de que sea un error extraño):
private File photofile;
private Uri mMakePhotoUri;
y esta es mi función de cámara de inicio:
@SuppressLint("SimpleDateFormat")
public void farefoto(int num){
// For naming the picture
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String n = sdf.format(new Date());
String fotoname = "Immagine-"+ n +".jpg";
//Going through files and folders
File photostorage = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
File photostorage2 = new File(photostorage, "Immagini");
System.out.println(photostorage+"/n"+photostorage2);
photostorage2.mkdirs();
// My file (global)
photofile = new File(photostorage2, fotoname);
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //intent to start camera
// My URI (global)
mMakePhotoUri = Uri.fromFile(photofile);
new Bundle(); // I took this code from internet, but if I remove this line, it''s the same
i.putExtra(MediaStore.EXTRA_OUTPUT, mMakePhotoUri);
startActivityForResult(i, num); //num would be 1 on calling function
}
y mi actividadresultado
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == 1){
try{ // tring my global URI
photo = f.decodeAndResizeFile(new File(mMakePhotoUri.getPath()));
}
catch(NullPointerException ex){
System.out.println("fail");
ex.printStackTrace();
try{ // Trying my global FILE
photo = BitmapFactory.decodeFile(photofile.getAbsolutePath());
} catch (Exception e){
e.printStackTrace();
Toast.makeText(this, "C''è stato un errore. Riprova a scattare la foto.", Toast.LENGTH_LONG).show();
}
......
......
.......
}
Obteniendo siempre NullPointerException
Pero ... si vuelvo a tomar la foto, ¡FUNCIONA! .
He leído todo lo que pude aquí ... pero no tiene lógica cuando modifico una variable global y no puedo volver a tomarla ...
Gracias por adelantado. Aclamaciones.
SOLUCIÓN
Como dijo Alex Cohn , mi problema era que estaba llamando a onCreate
antes en el onActivityResult
debido a una posible onActivityResult
de memoria (porque a veces no lo hace), así que quería tener mi aplicación "saludable" y probé un poco de try / catch
y así obtengo los datos incluso si se está llamando a onCreate
o a onActivityResult
de onActivityResult
para la primera llamada, y escribí esos datos en un paquete como se explica en el enlace de restauración de nuestro estado .
¡Gracias!.
Es posible que el lanzamiento de ACTION_IMAGE_CAPTURE
su actividad de la memoria. Debería comprobar (simplemente, un registro, el depurador puede tener sus propios efectos secundarios) que onCreate()
de su actividad se llama antes en onActivityResult()
. Si este es el caso, debe preparar su actividad para reiniciarse, probablemente usando onSaveInstanceState(Bundle)
.
Tenga en cuenta que la decisión de cerrar la actividad o mantenerla en segundo plano depende del estado general del sistema que escapa a su control. No me sorprenderá si la decisión de tomar la primera fotografía es "¡cerrarlo!", Pero cuando vuelves a fotografiar, es "mantenerlo en segundo plano".
No destruye las variables. Pero después de tantos días de investigación jaja, tengo una solución a mi error. Cuando coloco el depurador, el método lo llama como después de tomar una foto.
- onCreate ()
- onActivityResult ()
- onCeate ()
- En resumen()
Se fija solo con estas siguientes líneas en el mensaje más reciente. Sucede debido a los cambios de configuración de la cámara y al modo de entrada suave de la ventana.
<activity
android:name="packageName.Activity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize" >