jest to dobrze udokumentowany błąd w niektórych wersjach Androida. oznacza to, że w wersjach Androida z doświadczeniem Google przechwytywanie obrazu nie działa zgodnie z dokumentacją. to, czego zwykle używałem, to coś takiego w klasie narzędzi.
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);
}
następnie, kiedy uruchamiam przechwytywanie obrazu, tworzę intencję, która sprawdza, czy nie ma błędu.
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);
następnie w ramach czynności, do której wracam, robię różne rzeczy w zależności od urządzenia.
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();
}
}
Dzięki temu nie musisz pisać nowej aplikacji aparatu, ale ten kod też nie jest świetny. są duże problemy
nigdy nie otrzymujesz pełnowymiarowych obrazów z urządzeń z błędem. otrzymujesz obrazy o szerokości 512 pikseli, które są wstawiane do dostawcy zawartości obrazu. na urządzeniach bez błędu wszystko działa jak dokument, masz duży normalny obraz.
musisz zachować tę listę. jak napisano, możliwe jest flashowanie urządzeń z wersją Androida (powiedzmy kompilacją CyanogenMod ), która ma naprawiony błąd. jeśli tak się stanie, twój kod ulegnie awarii. rozwiązaniem jest użycie całego odcisku palca urządzenia.