在某些版本的android中,这是一个有据可查的错误。也就是说,在android的google体验版本中,图像捕获无法按文档所述进行。我通常使用的是Utility类中的类似内容。
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的builds)来刷新设备。如果发生这种情况,您的代码将崩溃。解决方法是使用整个设备的指纹。