Objetivo de la cámara no funciona con Samsung Galaxy S3

Tengo una actividad wherin doy al usuario una opción para hacer clic en una imagen de la cámara, a continuación, almacenar esta imagen en una matriz de bytes y en la base de datos. Sin embargo, mi código no parece funcionar en Samsung Galaxy S3 a continuación es el código:

Intención de llamada de la cámara:

if (i == 0) { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); } 

Método On Activity para la cámara:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1337 && resultCode == RESULT_OK) { Bundle extras = data.getExtras(); if (extras != null) { BitmapFactory.Options options = new BitmapFactory.Options(); thumbnail = (Bitmap) extras.get("data"); image(thumbnail); } else { Toast.makeText(CreateProfile.this, "Picture NOt taken", Toast.LENGTH_LONG).show(); } super.onActivityResult(requestCode, resultCode, data); } } 

Mi imagen (miniatura de mapa de bits):

 public void image(Bitmap thumbnail) { Bitmap photo = thumbnail; ByteArrayOutputStream bos = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.PNG, 100, bos); b = bos.toByteArray(); ImageView imageview = (ImageView)findViewById(R.id.imageView1); Bitmap bt = Bitmap.createScaledBitmap(photo, 100, 80, false); imageview.setImageBitmap(bt); } 

Sin embargo, esto no estaba funcionando con Samsung S3, cambié el código a la siguiente y ahora funciona con Samsung S3, sin embargo, no funciona con ningún otro dispositivo.

Propósito de la Cámara:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

Actividad para el resultado:

 startActivityForResult(intent, CAMERA_IMAGE_CAPTURE); protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == CAMERA_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { // Describe the columns you'd like to have returned. Selecting from the Thumbnails location gives you both the Thumbnail Image ID, as well as the original image ID String[] projection = { MediaStore.Images.Thumbnails._ID, // The columns we want MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Thumbnails.KIND, MediaStore.Images.Thumbnails.DATA}; String selection = MediaStore.Images.Thumbnails.KIND + "=" + // Select only mini's MediaStore.Images.Thumbnails.MINI_KIND; String sort = MediaStore.Images.Thumbnails._ID + " DESC"; //At the moment, this is a bit of a hack, as I'm returning ALL images, and just taking the latest one. There is a better way to narrow this down I think with a WHERE clause which is currently the selection variable Cursor myCursor = this.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, selection, null, sort); long imageId = 0l; long thumbnailImageId = 0l; String thumbnailPath = ""; try{ myCursor.moveToFirst(); imageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID)); thumbnailImageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID)); thumbnailPath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); } finally{myCursor.close();} //Create new Cursor to obtain the file Path for the large image String[] largeFileProjection = { MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA }; String largeFileSort = MediaStore.Images.ImageColumns._ID + " DESC"; myCursor = this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort); String largeImagePath = ""; try{ myCursor.moveToFirst(); //This will actually give yo uthe file path location of the image. largeImagePath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA)); } finally{myCursor.close();} // These are the two URI's you'll be interested in. They give you a handle to the actual images Uri uriLargeImage = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(imageId)); Uri uriThumbnailImage = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, String.valueOf(thumbnailImageId)); // I've left out the remaining code, as all I do is assign the URI's to my own objects anyways... // Toast.makeText(this, ""+largeImagePath, Toast.LENGTH_LONG).show(); // Toast.makeText(this, ""+uriLargeImage, Toast.LENGTH_LONG).show(); // Toast.makeText(this, ""+uriThumbnailImage, Toast.LENGTH_LONG).show(); if (largeImagePath != null) { // Toast.makeText(this, "" + largeImagePath, Toast.LENGTH_LONG).show(); BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = OG; // thumbnail = (BitmapFactory.decodeFile(picturePath)); thumbnail = BitmapFactory.decodeFile((largeImagePath), opts); System.gc(); if (thumbnail != null) { Toast.makeText(this, "Success", Toast.LENGTH_LONG).show(); } image(thumbnail); } if (uriLargeImage != null) { Toast.makeText(this, "" + uriLargeImage, Toast.LENGTH_LONG).show(); } if (uriThumbnailImage != null) { Toast.makeText(this, "" + uriThumbnailImage, Toast.LENGTH_LONG).show(); } } 

Esta es mi función image ():

 public void image(Bitmap thumbnail) { b = null; Bitmap photo = thumbnail; ByteArrayOutputStream bos = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.PNG, 100, bos); b = bos.toByteArray(); if (b != null) { Toast.makeText(this, "Success Yeah" + b, Toast.LENGTH_LONG).show(); } } 

Mientras que como todos los tres 1) uriLargeImage 2) largeImagePath 3) uriThumbnailImage devolverme la ruta o URI No puedo establecer el mapa de bits creado a mi ImageView. Sin embargo, este es el caso de Samsung S3 sólo, si ejecuto el código editado anteriormente con cualquier otro dispositivo, el programa se bloquea.

En el manifiesto que he usado

 android:configChanges="keyboardHidden|orientation" 

Basado en el tutorial: http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/

Sin embargo, si tomo la foto en el modo de paisaje, todo funciona bien! ¡¡Estoy confundido!! (En Samsung S3)

Finalmente después de luchar por tres días, he ideado un mecanismo simple para superar la saga Samsung S3.

Debajo está el código, un resumen rápido del código es que compruebo primero el fabricante del dispositivo y basado en esto llamo intents diferentes para la cámara.

 public class MainActivity extends Activity { private static int RESULT_LOAD_IMAGE = 1; private static final int PICK_FROM_GALLERY = 2; int CAMERA_PIC_REQUEST = 1337; Bitmap thumbnail = null; private static final int OG = 4; private static final int CAMERA_IMAGE_CAPTURE = 0; Uri u; ImageView imgview; // int z=0; String z = null; byte b[]; String largeImagePath = ""; Uri uriLargeImage; Uri uriThumbnailImage; Cursor myCursor; public void imageCam(Bitmap thumbnail) { Bitmap photo = thumbnail; ByteArrayOutputStream bos = new ByteArrayOutputStream(); photo.compress(Bitmap.CompressFormat.JPEG, 70, bos); b = bos.toByteArray(); ImageView imageview = (ImageView) findViewById(R.id.imageView1); imageview.setImageBitmap(photo); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button bt = (Button) findViewById(R.id.button1); bt.setOnClickListener(onBTN); if (savedInstanceState != null) { Bitmap Zatang; String B1 = savedInstanceState.getString("message"); Toast.makeText(this, "SavedYeah" + B1, Toast.LENGTH_LONG).show(); BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = OG; Zatang = BitmapFactory.decodeFile((B1), opts); System.gc(); if (Zatang != null) { Toast.makeText(this, "Success Zatang" + B1, Toast.LENGTH_LONG) .show(); imageCam(Zatang); } } } private View.OnClickListener onBTN = new View.OnClickListener() { public void onClick(View v) { openNewGameDialog(); } }; String[] B = { "Cam", "Gallery" }; private void openNewGameDialog() { new AlertDialog.Builder(this).setItems(B,new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialoginterface,int i) { if (i == 0) { String BX1 = android.os.Build.MANUFACTURER; if(BX1.equalsIgnoreCase("samsung")) { Toast.makeText(getApplicationContext(), "Device man"+BX1, Toast.LENGTH_LONG).show(); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, CAMERA_IMAGE_CAPTURE); } else { Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST); } } else if (i == 1) { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); startActivityForResult(intent, RESULT_LOAD_IMAGE); } }).show(); } protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode==CAMERA_IMAGE_CAPTURE && resultCode==Activity.RESULT_OK){ // Describe the columns you'd like to have returned. Selecting from the Thumbnails location gives you both the Thumbnail Image ID, as well as the original image ID String[] projection = { MediaStore.Images.Thumbnails._ID, // The columns we want MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Thumbnails.KIND, MediaStore.Images.Thumbnails.DATA}; String selection = MediaStore.Images.Thumbnails.KIND + "=" + // Select only mini's MediaStore.Images.Thumbnails.MINI_KIND; String sort = MediaStore.Images.Thumbnails._ID + " DESC"; //At the moment, this is a bit of a hack, as I'm returning ALL images, and just taking the latest one. There is a better way to narrow this down I think with a WHERE clause which is currently the selection variable myCursor = this.managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, selection, null, sort); long imageId = 0l; long thumbnailImageId = 0l; String thumbnailPath = ""; try { myCursor.moveToFirst(); imageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.IMAGE_ID)); thumbnailImageId = myCursor.getLong(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID)); thumbnailPath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails.DATA)); } finally { myCursor.close(); } //Create new Cursor to obtain the file Path for the large image String[] largeFileProjection = { MediaStore.Images.ImageColumns._ID, MediaStore.Images.ImageColumns.DATA }; String largeFileSort = MediaStore.Images.ImageColumns._ID + " DESC"; myCursor = this.managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, largeFileProjection, null, null, largeFileSort); largeImagePath = ""; try { myCursor.moveToFirst(); //This will actually give yo uthe file path location of the image. largeImagePath = myCursor.getString(myCursor.getColumnIndexOrThrow(MediaStore.Images.ImageColumns.DATA)); } finally { myCursor.close(); } // These are the two URI's you'll be interested in. They give you a handle to the actual images uriLargeImage = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(imageId)); uriThumbnailImage = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, String.valueOf(thumbnailImageId)); // I've left out the remaining code, as all I do is assign the URI's to my own objects anyways... // Toast.makeText(this, ""+largeImagePath, Toast.LENGTH_LONG).show(); // Toast.makeText(this, ""+uriLargeImage, Toast.LENGTH_LONG).show(); // Toast.makeText(this, ""+uriThumbnailImage, Toast.LENGTH_LONG).show(); if (largeImagePath != null) { Toast.makeText(this, "LARGE YES"+largeImagePath, Toast.LENGTH_LONG).show(); BitmapFactory.Options opts = new BitmapFactory.Options(); opts.inSampleSize = OG; thumbnail = BitmapFactory.decodeFile((largeImagePath), opts); System.gc(); if (thumbnail != null) { Toast.makeText(this, "Try Without Saved Instance", Toast.LENGTH_LONG).show(); imageCam(thumbnail); } } if (uriLargeImage != null) { Toast.makeText(this, ""+uriLargeImage, Toast.LENGTH_LONG).show(); } if (uriThumbnailImage != null) { Toast.makeText(this, ""+uriThumbnailImage, Toast.LENGTH_LONG).show(); } } if( requestCode == 1337 && resultCode== RESULT_OK){ Bundle extras = data.getExtras(); if (extras.keySet().contains("data") ){ BitmapFactory.Options options = new BitmapFactory.Options(); thumbnail = (Bitmap) extras.get("data"); if (thumbnail != null) { Toast.makeText(this, "YES Thumbnail", Toast.LENGTH_LONG).show(); BitmapFactory.Options opt = new BitmapFactory.Options(); thumbnail = (Bitmap) extras.get("data"); imageCam(thumbnail); } } else { Uri imageURI = getIntent().getData(); ImageView imageview = (ImageView)findViewById(R.id.imageView1); imageview.setImageURI(imageURI); if(imageURI != null){ Toast.makeText(this, "YES Image Uri", Toast.LENGTH_LONG).show(); } } super.onActivityResult(requestCode, resultCode, data); } if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); BitmapFactory.Options opts = new BitmapFactory.Options(); thumbnail = BitmapFactory.decodeFile((picturePath), opts); System.gc(); imageCam(thumbnail); } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("message",largeImagePath ); } } } 
  • Google Maps v2 que centra y que da vuelta a la posición de la cámara para caber dos marcadores
  • Cámara Android, onPictureTaken (byte imgData, Cámara fotográfica) método & PictureCallback nunca llamado
  • Selección de imágenes y vídeos en Android en 2.1 mediante ACTION_GET_CONTENT
  • Android: obtener tamaños de vídeo compatibles
  • Cámara incorporada, utilizando el MediaStore.EXTRA_OUTPUT extra almacena imágenes dos veces (en mi carpeta, y en el valor predeterminado)
  • Cómo obtener imágenes de la imagen de vídeo en Android
  • Android setFocusArea y enfoque automático
  • Androide imagen de la cámara uri de regreso con una falla de resultados ResultInfo
  • Objeto de cámara siempre devuelve nulo
  • Uso del URI de contenido con ACTION_VIDEO_CAPTURE
  • ¿Existe una manera eficiente de realizar un enfoque automático "continuo"?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.