これは、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();
}
}
これにより、新しいカメラアプリを作成する手間が省けますが、このコードもすばらしいものではありません。大きな問題は
バグのあるデバイスからフルサイズの画像を取得することはありません。画像コンテンツプロバイダーに挿入される幅512pxの画像を取得します。バグのないデバイスでは、すべてがドキュメントとして機能し、大きな通常の画像が得られます。
リストを維持する必要があります。書かれているように、バグが修正されたバージョンのAndroid(たとえばcyanogenmodのビルド)でデバイスがフラッシュされる可能性があります。その場合、コードはクラッシュします。修正は、デバイス全体のフィンガープリントを使用することです。