questo è un bug ben documentato in alcune versioni di Android. vale a dire, sulle esperienze di google build di Android, l'acquisizione di immagini non funziona come documentato. quello che ho generalmente usato è qualcosa di simile in una classe di utilità.
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);
}
quindi quando avvio l'acquisizione di immagini, creo un intento che controlla il bug.
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);
quindi nell'attività a cui torno, faccio diverse cose in base al 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();
}
}
questo ti evita di dover scrivere una nuova app per la fotocamera, ma neanche questo codice è eccezionale. i grandi problemi sono
non ottieni mai immagini a grandezza naturale dai dispositivi con il bug. ottieni immagini larghe 512 pixel che vengono inserite nel provider di contenuti di immagini. sui dispositivi senza bug, tutto funziona come un documento, ottieni un'immagine normale di grandi dimensioni.
devi mantenere la lista. come scritto, è possibile eseguire il flashing dei dispositivi con una versione di Android (ad esempio build di cyanogenmod ) che ha corretto il bug. in tal caso, il codice si arresterà in modo anomalo. la soluzione consiste nell'utilizzare l'intera impronta digitale del dispositivo.