Este es un error bien documentado en algunas versiones de Android. es decir, en las versiones de Android de la experiencia de Google, la captura de imágenes no funciona como se documenta. lo que generalmente he usado es algo como esto en una clase de utilidades.
public boolean hasImageCaptureBug() {
// list of known devices that have the bug
ArrayList<String> devices = new ArrayList<String>();
devices.add("android-devphone1/dream_devphone/dream");
devices.add("generic/sdk/generic");
devices.add("vodafone/vfpioneer/sapphire");
devices.add("tmobile/kila/dream");
devices.add("verizon/voles/sholes");
devices.add("google_ion/google_ion/sapphire");
return devices.contains(android.os.Build.BRAND + "/" + android.os.Build.PRODUCT + "/"
+ android.os.Build.DEVICE);
}
luego, cuando inicio la captura de imágenes, creo una intención que comprueba el error.
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (hasImageCaptureBug()) {
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/tmp")));
} else {
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
startActivityForResult(i, mRequestCode);
luego, en la actividad a la que regreso, hago diferentes cosas según el dispositivo.
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case GlobalConstants.IMAGE_CAPTURE:
Uri u;
if (hasImageCaptureBug()) {
File fi = new File("/sdcard/tmp");
try {
u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null));
if (!fi.delete()) {
Log.i("logMarker", "Failed to delete " + fi);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
u = intent.getData();
}
}
esto le ahorra tener que escribir una nueva aplicación de cámara, pero este código tampoco es excelente. los grandes problemas son
nunca obtienes imágenes de tamaño completo de los dispositivos con el error. obtienes imágenes de 512 píxeles de ancho que se insertan en el proveedor de contenido de imágenes. en dispositivos sin el error, todo funciona como documento, obtienes una gran imagen normal.
Tienes que mantener la lista. tal como está escrito, es posible que los dispositivos se actualicen con una versión de Android (digamos las compilaciones de cyanogenmod ) que tiene el error corregido. Si eso sucede, su código se bloqueará. la solución es usar toda la huella digital del dispositivo.