visor una studio ruta open imagenes imagen galeria example desde cargar camara android file nullpointerexception camera onactivityresult

android - una - startactivityforresult camera



Cámara Android: archivo vacío en el método OnActivityResult (1)

Tengo una actividad para abrir la cámara y tomar la foto en el método onActivityResult. Tres dispositivos funcionaron bien sin errores, pero solo en un dispositivo obtuve un error nulo en la variable del archivo .

"Intento de invocar el método virtual java.lang.String java.io.File.getPath () en una referencia de objeto nulo"

Esta es la forma en que lo implementé.

A) Paso uno: cámara abierta

Al hacer clic en un botón, ejecuto el siguiente código. Este código:

  1. Crea un nuevo archivo
  2. Intento de cámara abierta

    //create file imgName = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()) + ".jpg"; //global variable file = new File(Environment.getExternalStorageDirectory(), imgName); if(file != null){ //save image here Uri relativePath = Uri.fromFile(file); //Open camera Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, relativePath); startActivityForResult(intent, Constant.CAMERA_PIC_REQUEST); }

B) Paso dos: toma una foto y haz clic en el botón Guardar

C) Paso tres: tomar la foto en el método onActivityResult ()

  1. Verifique la constante = Constante.CAMERA_PIC_REQUEST.

  2. Obtenga los datos EXIF ​​de la foto y descubra el ángulo requerido para rotar la foto.

  3. Establece el ancho, alto y ángulo. Crea la foto .jpg

  4. Guarde el nombre y la ruta de la imagen creada en imageArray

  5. Establecer la vista de cuadrícula con imageArray

    public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case Constant.CAMERA_PIC_REQUEST: try { //Get EXIF data and rotate photo (1. file.getPath() has been used) ExifInterface exif = new ExifInterface(file.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0;// Landscape //rotate photo if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { angle = 90; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { angle = 180; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { angle = 270; } Matrix matrix = new Matrix(); matrix.postRotate(angle); try { //Create the rotated .jpg file (2. file.getPath() has been used) Bitmap correctBmp = Func.decodeSampleBitmapFromFile(file.getPath(), Constant.PHOTO_WIDTH, Constant.PHOTO_HEIGHT); correctBmp = Bitmap.createBitmap(correctBmp, 0, 0, correctBmp.getWidth(), correctBmp.getHeight(), matrix, true); FileOutputStream fOut; fOut = new FileOutputStream(file); correctBmp.compress(Bitmap.CompressFormat.JPEG, 80, fOut); fOut.flush(); fOut.close(); //image saved successfully - add photo name into reference array. Later I will use this //(3. file.getPath() has been used) Image img = new Image(); img.setImageName(imgName); img.setAbsolutePath(file.getAbsolutePath()); img.setRelativePath(Uri.fromFile(file)); imageArray.add(img);//save in array } catch (FileNotFoundException e) { Log.e("Error", e.getMessage()); } catch (IOException e) { Log.e("Error", e.getMessage()); } } catch (Exception e) { //This exception is triggering. Log.e("Error 15", e.getMessage()); } //set this photo in a grid view for user to see setGridView(imageArray); break; case Constant.POPUPFRAG: //something else break; default: //deafult break; } } }

El error 15 (tercera excepción) se activa solo en un teléfono. No estoy seguro de por qué es eso. Muestra la excepción de puntero nulo que publiqué anteriormente.

Tres dispositivos que podrían ejecutarse por encima del código tienen al menos Android v4.0 o superior. El teléfono que me da una excepción nula es Samsung Galaxy Note 3 Android v5.0 . (Aunque el código está fallando, pude encontrar la foto en la galería del teléfono)

¿Puedes sugerirme qué podría salir mal aquí? ¿Me estoy perdiendo de algo? De todos modos para mejorar este código?

¡Gracias!


En lugar de usar directamente file.getPath() puede obtener un uso como este.

Crea un variado global de Uri luego úsalo en toda la actividad.

private Uri imageToUploadUri; file = new File(Environment.getExternalStorageDirectory(), imgName); if(file != null){ //save image here imageToUploadUri = Uri.fromFile(file); //Open camera Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageToUploadUri); startActivityForResult(intent, Constant.CAMERA_PIC_REQUEST); }

a continuación, en su onActivityResult() use así:

public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case Constant.CAMERA_PIC_REQUEST: try { ExifInterface exif = new ExifInterface(imageToUploadUri.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int angle = 0;// Landscape //rotate photo if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { angle = 90; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { angle = 180; } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { angle = 270; } Matrix matrix = new Matrix(); matrix.postRotate(angle); try { //Create the rotated .jpg file (2. file.getPath() has been used) Bitmap correctBmp = Func.decodeSampleBitmapFromFile(imageToUploadUri.getPath(), Constant.PHOTO_WIDTH, Constant.PHOTO_HEIGHT); correctBmp = Bitmap.createBitmap(correctBmp, 0, 0, correctBmp.getWidth(), correctBmp.getHeight(), matrix, true); FileOutputStream fOut; fOut = new FileOutputStream(file); correctBmp.compress(Bitmap.CompressFormat.JPEG, 80, fOut); fOut.flush(); fOut.close(); //image saved successfully - add photo name into reference array. Later I will use this //(3. file.getPath() has been used) Image img = new Image(); img.setImageName(imgName); img.setAbsolutePath(file.getAbsolutePath()); img.setRelativePath(imageToUploadUri); imageArray.add(img);//save in array } catch (FileNotFoundException e) { Log.e("Error", e.getMessage()); } catch (IOException e) { Log.e("Error", e.getMessage()); } } catch (Exception e) { //This exception is triggering. Log.e("Error 15", e.getMessage()); } //set this photo in a grid view for user to see setGridView(imageArray); break; case Constant.POPUPFRAG: //something else break; default: //deafult break; } } }

¡Espero que te ayude!