Actividad de la cámara que devuelve nulo a Android

Estoy creando una aplicación en la que quiero capturar una imagen por actividad predeterminada de la cámara y volver a mi actividad y cargar esa imagen en una vista de imagen. El problema es que la actividad de la cámara siempre vuelve nula. En mi método onActivityResult (int requestCode, int resultCode, Intent data) estoy recibiendo datos como null. Aquí está mi código

public class CameraCapture extends Activity { protected boolean _taken = true; File sdImageMainDirectory; Uri outputFileUri; protected static final String PHOTO_TAKEN = "photo_taken"; private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0; @Override public void onCreate(Bundle savedInstanceState) { try { super.onCreate(savedInstanceState); setContentView(R.layout.cameracapturedimage); File root = new File(Environment .getExternalStorageDirectory() + File.separator + "myDir" + File.separator); root.mkdirs(); sdImageMainDirectory = new File(root, "myPicName"); startCameraActivity(); } catch (Exception e) { finish(); Toast.makeText(this, "Error occured. Please try again later.", Toast.LENGTH_SHORT).show(); } } protected void startCameraActivity() { outputFileUri = Uri.fromFile(sdImageMainDirectory); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE: { if(resultCode==Activity.RESULT_OK) { try{ ImageView imageView=(ImageView)findViewById(R.id.cameraImage); imageView.setImageBitmap((Bitmap) data.getExtras().get("data")); } catch (Exception e) { // TODO: handle exception } } break; } default: break; } } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { if (savedInstanceState.getBoolean(CameraCapture.PHOTO_TAKEN)) { _taken = true; } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putBoolean(CameraCapture.PHOTO_TAKEN, _taken); } 

¿¿¿¿¿¿¿¿¿¿Estoy haciendo algo mal??????????

Usted se está equivocando porque lo está haciendo de manera incorrecta.

Si pasa el parámetro adicional MediaStore.EXTRA_OUTPUT con la intención de la cámara, la actividad de la cámara escribirá la imagen capturada en esa ruta y no devolverá el mapa de bits en el método onActivityResult .

Si va a comprobar la ruta que está pasando, entonces sabrá que en realidad la cámara había escrito el archivo capturado en ese camino.

Para más información puedes seguir esto , esto y este

Lo estoy haciendo de otra manera. El campo data.getData () no está garantizado para devolver un Uri, por lo que estoy comprobando si es nulo o no, si es entonces la imagen está en extras. Así que el código sería –

 if(data.getData()==null){ bitmap = (Bitmap)data.getExtras().get("data"); }else{ bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), data.getData()); } 

Estoy utilizando este código en la aplicación de producción, y está funcionando.

Tuve un problema similar. Había comentado algunas líneas en mi archivo de manifiesto que hizo que los datos de miniatura se devolvieran como nulos.

Necesita lo siguiente para que esto funcione:

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

Espero que esto resuelva su problema

Si tu teléfono es un Samsung, podría estar relacionado con este http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/

Hay otra pregunta abierta que puede dar información adicional

Si está utilizando un ImageView para mostrar el mapa de bits devuelto por Intención de la cámara, debe guardar la referencia de la vista de imagen dentro de OnSaveInstanceState y también restaurarla más adelante dentro de OnRestoreInstanceState. Compruebe el código de onSaveInstanceState y onRestoreInstanceState a continuación.

 public class MainActivity extends Activity { private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 1; String mCurrentPhotoPath; ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); imageView = (ImageView) findViewById(R.id.imageView1); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } public void startCamera(View v) throws IOException { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File photoFile = null; photoFile = createImageFile(); //intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(photoFile)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); } } protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); System.out.println(imageBitmap); imageView.setImageBitmap(imageBitmap); } } private File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File image = File.createTempFile(imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents mCurrentPhotoPath = "file:" + image.getAbsolutePath(); System.out.println(mCurrentPhotoPath); return image; } private void setPic() { // Get the dimensions of the View int targetW = imageView.getWidth(); int targetH = imageView.getHeight(); // Get the dimensions of the bitmap BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; // Determine how much to scale down the image int scaleFactor = Math.min(photoW/targetW, photoH/targetH); // Decode the image file into a Bitmap sized to fill the View bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; bmOptions.inPurgeable = true; Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); imageView.setImageBitmap(bitmap); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); System.out.println(mCurrentPhotoPath); imageView = (ImageView) findViewById(R.id.imageView1); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onRestoreInstanceState(savedInstanceState); System.out.println(mCurrentPhotoPath); imageView = (ImageView) findViewById(R.id.imageView1); } } 

Prueba el siguiente código

  { final String[] imageColumns = { MediaStore.Images.Media._ID,MediaStore.Images.Media.DATA }; final String imageOrderBy = MediaStore.Images.Media._ID + " DESC"; Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns, null, null, imageOrderBy); imageCursor.moveToFirst(); do { String fullPath = imageCursor.getString(imageCursor.getColumnIndex(MediaStore.Images.Media.DATA)); if (fullPath.contains("DCIM")) { //get bitmap from fullpath here. return; } } while (imageCursor.moveToNext()); 

Después de muchas búsquedas:

 private static final int TAKE_PHOTO_REQUEST = 1; private ImageView mImageView; String mCurrentPhotoPath; private File photoFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_saisir_frais); mImageView = (ImageView) findViewById(R.id.imageViewPhoto); dispatchTakePictureIntent(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PHOTO_REQUEST && resultCode == RESULT_OK) { // set the dimensions of the image int targetW =100; int targetH = 100; // Get the dimensions of the bitmap BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(photoFile.getAbsolutePath(), bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; // Determine how much to scale down the image int scaleFactor = Math.min(photoW/targetW, photoH/targetH); // Decode the image file into a Bitmap sized to fill the View bmOptions.inJustDecodeBounds = false; bmOptions.inSampleSize = scaleFactor; bmOptions.inPurgeable = true; // stream = getContentResolver().openInputStream(data.getData()); Bitmap bitmap = BitmapFactory.decodeFile(photoFile.getAbsolutePath(),bmOptions); mImageView.setImageBitmap(bitmap); } } private File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents mCurrentPhotoPath = "file:" + image.getAbsolutePath(); return image; } private void dispatchTakePictureIntent() { Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); try { photoFile = createImageFile(); takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); startActivityForResult(takePhotoIntent, TAKE_PHOTO_REQUEST); } catch (IOException e) { e.printStackTrace(); } } 

Puede generar mapa de bits desde el archivo que envía a la intención de la cámara. Por favor, utilice este código …

 @Override public void onActivityResult(int requestCode, int resultCode, Intent data){ switch (requestCode) { case CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE: { if(resultCode==Activity.RESULT_OK) { int orientation = getOrientationFromExif(sdImageMainDirectory);// get orientation that image taken BitmapFactory.Options options = new BitmapFactory.Options(); InputStream is = null; Matrix m = new Matrix(); m.postRotate(orientation);//rotate image is = new FileInputStream(sdImageMainDirectory); options.inSampleSize = 4 //(original_image_size/4); Bitmap bitmap = BitmapFactory.decodeStream(is,null,options); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), m, true); // set bitmap to image view //bitmap.recycle(); } break; } default: break; } } private int getOrientationFromExif(String imagePath) { int orientation = -1; try { ExifInterface exif = new ExifInterface(imagePath); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (exifOrientation) { case ExifInterface.ORIENTATION_ROTATE_270: orientation = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: orientation = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; break; case ExifInterface.ORIENTATION_NORMAL: orientation = 0; break; default: break; } } catch (IOException e) { //Log.e(LOG_TAG, "Unable to get image exif orientation", e); } return orientation; } 
 File cameraFile = null; public void openChooser() { Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraFile = new File(android.os.Environment.getExternalStorageDirectory(), "temp.jpg"); takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(cameraFile)); String pickTitle = "Select or take a new Picture"; // Or get from strings.xml Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,new Intent[]{takePhotoIntent}); startActivityForResult(chooserIntent, SELECT_PHOTO); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case SELECT_PHOTO: if (resultCode == Activity.RESULT_OK) { Uri selectedImage = data.getData(); if (selectedImage != null) { //from gallery } else if (cameraFile != null) { //from camera Uri cameraPictureUri = Uri.fromFile(cameraFile); } } break; } } 

Pruebe este tutorial. Funciona para mí y utiliza el permiso como de costumbre en el manifiesto y también permiso de verificación

https://androidkennel.org/android-camera-access-tutorial/

  • SetPreviewDisplay y setDisplayOrientation
  • Android: el zoom no efectúa los datos del marco de vista previa pasados ​​a onPreviewFrame ()
  • ¿Cómo obtener datos de vista previa sin procesar de un objeto de cámara al menos 15 cuadros por segundo en Android?
  • ¿Cómo utilizar el feed de cámara en vivo como un fondo de actividad?
  • Guardar imagen de la cámara de Android en la carpeta personalizada
  • Tomar fotos "simplemente" no funciona
  • Apertura de la cámara en un proceso diferente
  • Android: ¿Cómo guardar un marco de vista previa como imagen jpeg?
  • Problema de cierre de cámara en Samsung Galaxy S3 versión 4.1.1
  • ¿Cómo se puede utilizar Android Camera APIs en aplicaciones que no sean de la Cámara?
  • Vista previa de la cámara está borrosa en samsung galaxy grand pero es bueno en samsung s3
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.