Mi cámara Android Uri está devolviendo un valor nulo, pero la solución de Samsung está en su lugar, ¿me ayudo?

Así que estoy al tanto del problema de la cámara en los dispositivos de Samsung. Debes crear un Uri antes de invocar la intención de la cámara de esta manera:

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, m_username); mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); 

Este ejemplo crea un Uri para que la cámara almacene los datos. Mi aplicación tiene una función de cámara en dos ubicaciones. Ambos son idénticos (copiado directo), pero en una actividad el objeto mImageUri vuelve nulo durante el proceso de la cámara, mientras que en la otra no. Este último funciona bien, pero el primero da un valor nulo que a su vez me impide guardar la imagen, previsualizarla, etc. Proporcionaré el siguiente código onResult:

 case CAMERA_PIC_REQUEST : if(resultCode == RESULT_OK) { if(intent != null) { //For non-Samsung devices Log.e("Intent value:", intent.toString()); mImageUri = intent.getData(); } mAvatar = BitmapStatic.createImage(mImageUri, this); Drawable draw = new BitmapDrawable(getResources(), mAvatar); m_photoButtonE.setImageDrawable(draw); m_imageChanged = true; } break; 

El ejemplo anterior es de la actividad laboral. A continuación se muestra la actividad donde esto no funciona:

 //On pressing the "Take Photo" button: Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.TITLE, mUsername); mImageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); if(mImageUri == null) { Log.e("image uri is null", "what?"); } else { Log.e("oh nevermind", "image uri is NOT null"); } cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); //On Result: case CAMERA_PIC_REQUEST : if(resultCode == RESULT_OK) { if(intent != null) { Log.e("Intent value:", intent.toString()); mImageUri = intent.getData(); } else { Log.e("Intent is null", "yep it is."); if(mImageUri == null) { Log.e("nullcheck on memberimageuri", "its null"); } else { Log.e("nullcheckon memberimage", mImageUri.toString()); } } mImage = BitmapStatic.createImage(mImageUri, this); Drawable draw = new BitmapDrawable(getResources(), mImage); mPhotoPreview.setImageDrawable(draw); } break; 

Observe los archivos de registro que he puesto en este segundo ejemplo. Cuando hago clic en el botón “Tomar foto”, la comprobación nula del objeto mImageUri devuelve verdadero. Entonces este objeto no es nulo. Pero en algún lugar durante el proceso de toma de fotografías ese valor se convierte en nulo. El segundo control durante onResult () devuelve falso. Nuevamente, esto es casi idéntico a mi configuración en la otra actividad, donde funciona bien.

¿Alguna idea?

Su actividad se destruye durante la operación de actividad de la cámara y se vuelve a crear después. Debe usar el mecanismo onSaveInstanceState / onRestoreInstanceState en su actividad para preservar el URI de la imagen (y cualquier otro dato) al reiniciar la actividad.

Me gusta esto:

 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mImageUri != null) { outState.putString("cameraImageUri", mImageUri.toString()); } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); if (savedInstanceState.containsKey("cameraImageUri")) { mImageUri = Uri.parse(savedInstanceState.getString("cameraImageUri")); } } 

Puedo sugerir crear el archivo inicial (temporal) al principio, luego pasar el Uri en el Intento. En la función “onActivityResult ()” tendrá el archivo con la imagen completa.

 File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "folderName"); dir.mkdirs(); if (dir.exists()) { try { imageFile = File.createTempFile("IMG_", ".jpg", dir); } catch (IOException e) { e.printStackTrace(); } } if (imageFile != null) { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(imageFile)); activity.startActivityForResult(cameraIntent, REQUEST_CODE); }