在某些版本的 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 的构建)进行刷新。如果发生这种情况,您的代码将崩溃。解决方法是使用整个设备指纹。