Il s'agit d'un bogue bien documenté dans certaines versions d'Android, c'est-à-dire sur les versions d'Android de Google Experience, la capture d'image ne fonctionne pas comme indiqué dans la documentation. ce que j'ai généralement utilisé est quelque chose comme ceci dans une classe d'utilitaires.
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);
}
ensuite, lorsque je lance la capture d'image, je crée une intention qui vérifie la présence du bogue.
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);
ensuite, dans les activités auxquelles je retourne, je fais des choses différentes en fonction de l'appareil.
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();
}
}
cela vous évite d'avoir à écrire une nouvelle application caméra, mais ce code n'est pas génial non plus. les gros problèmes sont les suivants
-
vous n'obtenez jamais d'images de taille normale à partir les appareils présentant le bug. Vous obtenez des images de 512px de large qui qui sont insérées dans le fournisseur de contenu d'image. Sur les appareils sans le bogue, tout fonctionne comme dans le document, vous obtenez une grande image normale.
-
vous devez maintenir la liste. comme écrit, il est possible que des dispositifs soient flashés avec une version de Android (disons de cyanogenmod builds ) qui a le bug corrigé. Si cela arrive, votre code va code se plantera. La solution est d'utiliser l'empreinte l'empreinte du dispositif.