これは、Android の一部のバージョンで十分に文書化されたバグです。つまり、Android の Google エクスペリエンス ビルドでは、イメージ キャプチャがドキュメントどおりに機能しません。私が一般的に使用しているのは、ユーティリティクラスでこのようなものです。
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 ピクセルの画像を取得します。バグのないデバイスでは、すべてがドキュメントとして機能し、通常の大きな画像が得られます。
リストを維持する必要があります。書かれているように、バグが修正されたAndroid のバージョン ( cyanogenmod の buildsなど)でデバイスをフラッシュすることは可能です。その場合、コードはクラッシュします。修正は、デバイスの指紋全体を使用することです。