La aplicación se está bloqueando después de capturar la imagen con las intenciones

Mi aplicación se está estrellando después de capturar 5 a 6 fotos usando intents.log cat no muestra nada. Soy incapaz de encontrar la razón por la que se está estrellando. Por favor, ayúdame.

private void capturePhoto() { File root = new File(Environment.getExternalStorageDirectory(), "Feedback"); if (!root.exists()) { root.mkdirs(); } File file = new File(root, Constants.PROFILE_IMAGE_NAME + ".jpeg"); Uri outputFileUri = Uri.fromFile(file); Intent photoPickerIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); photoPickerIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); photoPickerIntent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); photoPickerIntent.putExtra("return-data", true); photoPickerIntent.putExtra("android.intent.extras.CAMERA_FACING", 1); startActivityForResult(photoPickerIntent, requestCode); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (this.requestCode == requestCode && resultCode == RESULT_OK) { File root = new File(Environment.getExternalStorageDirectory(), "Feedback"); if (!root.exists()) { root.mkdirs(); } File file = new File(root, Constants.PROFILE_IMAGE_NAME+".jpeg"); checkFlowIdisPresent(file); displayPic(); } } private void displayPic() { String filePath = Environment.getExternalStorageDirectory() .getAbsolutePath() + File.separator + "/Feedback/" + Constants.PROFILE_IMAGE_NAME + ".jpeg"; // Bitmap bmp = BitmapFactory.decodeFile(filePath); //Bitmap scaled = Bitmap.createScaledBitmap(bmp, 300, 300, true); File imgFile = new File(filePath); Bitmap bmp = decodeFile(imgFile); if (imgFile.exists()) { dispProfilePic.setImageBitmap(bmp); } else { dispProfilePic.setBackgroundResource(R.drawable.user_image); } } private Bitmap decodeFile(File f) { try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f), null, o); // The new size we want to scale to final int REQUIRED_SIZE = 70; // Find the correct scale value. It should be the power of 2. int scale = 1; while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE) { scale *= 2; } // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) { } return null; } 

Y encima el código es para capturar la foto y mostrar la imagen capturada en ImageView. Y estoy utilizando MI ficha.

Editar la aplicación realmente no se está estrellando … se convierte en pantalla blanca y si presiono cualquier botón, entonces se está estrellando y onActivityResult no se ejecuta cuando se convierte en pantalla en blanco

Nueva edición Capacidad para replicar esto. Hice clic en Android Monitor en que hice clic en Monitor. A continuación, muestra la utilización de la memoria de la aplicación cuando interactúo con la aplicación. Ahora en la barra lateral izquierda hice clic en terminar el icono de la aplicación. Ahora lo interesante es que destruye la actividad actual y se mueve a la actividad anterior. Esa actividad anterior se convierte en pantalla blanca.

Por favor, ayúdame chicos.

Pruebe este código. Lo uso en algunas de mis aplicaciones:

Método de lanzamiento del intento:

 private void launchCamera() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); } 

Resultado de captura:

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); try { if (requestCode == CAMERA_PIC_REQUEST) { if (data != null) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap thumbnail = (Bitmap) extras.get("data"); if (thumbnail != null) displayPic(thumbnail); } } } } catch (Exception e) { e.printStackTrace(); } } 

Bien tu código bien

Creo que guardar la imagen o sobrescribir la imagen en el mismo camino con el mismo nombre por lo que hay problema con la memoria. Así que te recomendamos cambiar el nombre con System.currentTimeMillis() o cualquier nombre aleatorio en lugar de Constants.PROFILE_IMAGE_NAME .

Y también compruebe el permiso

  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

También compruebe este permiso con tiempo de ejecución también … para tiempo de ejecución siga esto

 private static final int REQUEST_RUNTIME_PERMISSION = 123; if (CheckPermission(demo.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { capturePhoto(); } else { // you do not have permission go request runtime permissions RequestPermission(demo.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, REQUEST_RUNTIME_PERMISSION); } public void RequestPermission(Activity thisActivity, String Permission, int Code) { if (ContextCompat.checkSelfPermission(thisActivity, Permission) != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, Permission)) { capturePhoto(); } else { ActivityCompat.requestPermissions(thisActivity, new String[]{Permission}, Code); } } } public boolean CheckPermission(Activity context, String Permission) { if (ContextCompat.checkSelfPermission(context, Permission) == PackageManager.PERMISSION_GRANTED) { return true; } else { return false; } } 

Si no se muestra nada en el registro de gato es muy difícil especular nada, pero por favor, compruebe si el problema es cuando se utiliza el emulador y no en un dispositivo real. También puede comprobar si puede volver a crear el problema haciendo que la capacidad del emulador sea menor (RAM y memoria interna). Si ese es el caso, a continuación, aumentar la memoria o memoria RAM de su emulador y debe funcionar bien. A continuación, tendrá que trabajar en la optimización de la tarea de procesamiento de imagen para los dispositivos de menor especificación.

Espero que esto ayude.

Esto ocurre posiblemente porque la Actividad de Llamada se mata y luego se reinicia con el SO, ya que la intención de CAPTURA DE IMAGEN trata con una cantidad enorme de memoria para procesar el BITMAP capturado a través de CÁMARA.

Solución : guarde la ruta del archivo de la imagen y úsela cuando se llame OnActivityResult . Puede utilizar los métodos onSavedInstanceState y onRestoreInstanceState para guardar y recuperar el IMAGE_PATH y otros campos de la actividad.

Puede consultar este enlace para saber cómo usar onSavedInstanceState y onRestoreInstanceState

Intente hacerlo en una tarea Async porque el problema u se enfrenta a debido al proceso de abrazo hecho en el hilo de la interfaz de usuario

Consulte aquí para obtener más ayuda sobre la implementación de tareas Async

Esto puede ser un problema de memoria que está tomando fotos y almacenarlas en mapa de bits Compruebe su monitor de Android para la detección de memoria de APp Sólo tiene que hacer este método estático

 private static Bitmap decodeFile(File f) { try { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeStream(new FileInputStream(f), null, o); // The new size we want to scale to final int REQUIRED_SIZE = 70; // Find the correct scale value. It should be the power of 2. int scale = 1; while (o.outWidth / scale / 2 >= REQUIRED_SIZE && o.outHeight / scale / 2 >= REQUIRED_SIZE) { scale *= 2; } // Decode with inSampleSize BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; return BitmapFactory.decodeStream(new FileInputStream(f), null, o2); } catch (FileNotFoundException e) { } return null; } 

Guardar archivos con diferentes nombres como guardar con timestamp como nombre

Trate de usar el código a continuación. Funciona bien para mí.

  private static final int REQUEST_CAMERA = 1; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == REQUEST_CAMERA) { Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); thumbnail.compress(Bitmap.CompressFormat.JPEG, 90, bytes); File destination = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg"); FileOutputStream fos; try { destination.createNewFile(); fos = new FileOutputStream(destination); fos.write(bytes.toByteArray()); fos.close(); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } ivSetImage.setImageBitmap(thumbnail); } } } 

En el fragmento de código dado, he comprimido la imagen capturada, debido a que el problema de falla de la aplicación se resuelve.

En su caso, la calidad de imagen capturada podría ser alta debido a que su aplicación se está estrellando mientras configura una imagen en ImageView .

Sólo intente comprimir una imagen. ¡Funcionará!

No olvide agregar permiso en el archivo de manifiesto.

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

Compruebe su permiso de archivo Manifast.xml Almacenamiento externo

Y el permiso de cámara.

 <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> 

Si su aplicación se ejecuta en Marsh enter code here mallow comprobar permiso de tiempo de ejecución

Intente usar el código abajo:

 private void launchCamera() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); try { if (requestCode == CAMERA_PIC_REQUEST) { if (data != null) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap thumbnail = (Bitmap) extras.get("data"); if (thumbnail != null) displayPic(thumbnail); } } } } catch (Exception e) { e.printStackTrace(); } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.