นี่เป็นข้อผิดพลาดที่บันทึกไว้เป็นอย่างดีใน Android บางรุ่น นั่นคือบน Google Experience สร้างของ 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();
}
}
สิ่งนี้ช่วยให้คุณไม่ต้องเขียนแอพกล้องใหม่ แต่รหัสนี้ก็ไม่ได้ยอดเยี่ยมเช่นกัน ปัญหาใหญ่คือ
คุณไม่เคยได้รับภาพขนาดเต็มจากอุปกรณ์ที่มีบั๊ก คุณได้รับรูปภาพที่มีความกว้าง 512px ซึ่งใส่เข้าไปในผู้ให้บริการเนื้อหารูปภาพ บนอุปกรณ์ที่ไม่มีข้อผิดพลาดทุกอย่างทำงานเป็นเอกสารคุณจะได้ภาพใหญ่ปกติ
คุณต้องรักษารายการไว้ ตามที่เขียนไว้มันเป็นไปได้สำหรับอุปกรณ์ที่จะกระพริบพร้อมกับรุ่นของ Android (พูดสร้างของ cyanogenmod ) ที่มีการแก้ไขข้อผิดพลาด หากเกิดขึ้นรหัสของคุณจะผิดพลาด การแก้ไขคือการใช้ลายนิ้วมือของอุปกรณ์ทั้งหมด