이것은 일부 안드로이드 버전에서 잘 알려진 버그 입니다. 즉, Google의 Android 빌드에서 이미지 캡처가 문서화 된대로 작동하지 않습니다. 내가 일반적으로 사용한 것은 유틸리티 클래스에서 이와 같은 것입니다.
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);
}
그런 다음 이미지 캡처를 시작할 때 버그를 확인하는 의도를 만듭니다.
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);
그런 다음 내가 돌아온 활동에서 장치에 따라 다른 일을합니다.
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();
}
}
이렇게하면 새로운 카메라 앱을 작성하지 않아도되지만이 코드도 좋지 않습니다. 큰 문제는
버그가있는 장치에서 전체 크기의 이미지를 얻지 못합니다. 이미지 내용 제공자에 삽입 된 너비가 512 픽셀 인 사진을 얻습니다. 버그가없는 장치에서는 모든 것이 문서로 작동하므로 큰 그림이 나타납니다.
리스트를 유지해야합니다. 작성된 것처럼 버그가 수정 된 안드로이드 버전 ( 시아 노겐 모드 빌드 )으로 장치를 플래시 할 수 있습니다 . 이 경우 코드가 중단됩니다. 수정은 전체 장치 지문을 사용하는 것입니다.