From 04ffa9374293b5edd69f4f560b02f512a8fa9442 Mon Sep 17 00:00:00 2001 From: dswitkin Date: Fri, 11 Dec 2009 17:49:11 +0000 Subject: [PATCH] Fixed some sporadic crashes. git-svn-id: https://zxing.googlecode.com/svn/trunk@1151 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- android/res/values/strings.xml | 1 + .../zxing/client/android/CaptureActivity.java | 25 +++++++++++++++++-- .../client/android/encode/QRCodeEncoder.java | 3 +++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml index 534e81862..64d7c546b 100755 --- a/android/res/values/strings.xml +++ b/android/res/values/strings.xml @@ -56,6 +56,7 @@ History Share Based on the open source ZXing Barcode Library + Sorry, the Android camera encountered a problem. You may need to restart the device. Contents Format Hi diff --git a/android/src/com/google/zxing/client/android/CaptureActivity.java b/android/src/com/google/zxing/client/android/CaptureActivity.java index 0ebc30da7..67b24bc0d 100755 --- a/android/src/com/google/zxing/client/android/CaptureActivity.java +++ b/android/src/com/google/zxing/client/android/CaptureActivity.java @@ -114,7 +114,7 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal private String decodeMode; private String versionName; private HistoryManager historyManager; - + private final OnCompletionListener beepListener = new BeepListener(); private final DialogInterface.OnClickListener aboutListener = @@ -233,7 +233,9 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal return true; } else if ((source == Source.NONE || source == Source.ZXING_LINK) && lastResult != null) { resetStatusView(); - handler.sendEmptyMessage(R.id.restart_preview); + if (handler != null) { + handler.sendEmptyMessage(R.id.restart_preview); + } return true; } } else if (keyCode == KeyEvent.KEYCODE_FOCUS || keyCode == KeyEvent.KEYCODE_CAMERA) { @@ -546,6 +548,13 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal CameraManager.get().openDriver(surfaceHolder); } catch (IOException ioe) { Log.w(TAG, ioe); + displayFrameworkBugMessageAndExit(); + return; + } catch (RuntimeException e) { + // Barcode Scanner has seen crashes in the wild of this variety: + // java.?lang.?RuntimeException: Fail to connect to camera service + Log.e(TAG, e.toString()); + displayFrameworkBugMessageAndExit(); return; } if (handler == null) { @@ -554,6 +563,18 @@ public final class CaptureActivity extends Activity implements SurfaceHolder.Cal } } + private void displayFrameworkBugMessageAndExit() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(getString(R.string.app_name)); + builder.setMessage(getString(R.string.msg_camera_framework_bug)); + builder.setPositiveButton(R.string.button_ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialogInterface, int i) { + finish(); + } + }); + builder.show(); + } + private void resetStatusView() { resultView.setVisibility(View.GONE); statusView.setVisibility(View.VISIBLE); diff --git a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java index 599e40f5b..c55481c6a 100755 --- a/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java +++ b/android/src/com/google/zxing/client/android/encode/QRCodeEncoder.java @@ -159,6 +159,9 @@ final class QRCodeEncoder { return false; } catch (IOException e) { return false; + } catch (NullPointerException e) { + // In case the uri was not found in the Intent. + return false; } return contents != null && contents.length() > 0; }