title: What's wrong with my code for using the camera?
body: <p>I'm very new to Android. I'm trying to use the camera with an image overlay. I've seen many threads discussing this topic, but they're still a little over my head. Here's my Activity:</p>
  
  <pre><code>package com.commonsware.android.skeleton;
  
  import android.app.Activity;
  import android.content.Context;
  import android.hardware.Camera;
  import android.hardware.Camera.Size;
  import android.os.Bundle;
  import android.view.SurfaceHolder;
  import android.view.SurfaceView;
  import android.view.Window;
  import android.widget.FrameLayout;
  import java.io.IOException;
  import java.util.List;
  
  // ----------------------------------------------------------------------
  
  public class SimpleBulbActivity extends Activity {
      private Preview mPreview;
      FrameLayout preview;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
  
          // Hide the window title.
          requestWindowFeature(Window.FEATURE_NO_TITLE);
          setContentView(R.layout.main);
      }
  
      protected void onResume() {
          //Setup the FrameLayout with the Camera Preview Screen
          mPreview = new Preview(this);
          preview = (FrameLayout)findViewById(R.id.preview); 
          preview.addView(mPreview);
      }
  
  }
  
  // ----------------------------------------------------------------------
  
  class Preview extends SurfaceView implements SurfaceHolder.Callback {
      SurfaceHolder mHolder;
      Camera mCamera;
  
      Preview(Context context) {
          super(context);
  
          // Install a SurfaceHolder.Callback so we get notified when the
          // underlying surface is created and destroyed.
          mHolder = getHolder();
          mHolder.addCallback(this);
          mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      }
  
      public void surfaceCreated(SurfaceHolder holder) {
          // The Surface has been created, acquire the camera and tell it where
          // to draw.
          mCamera = Camera.open();
          try {
             mCamera.setPreviewDisplay(holder);
          } catch (IOException exception) {
              mCamera.release();
              mCamera = null;
              // TODO: add more exception handling logic here
          }
      }
  
      public void surfaceDestroyed(SurfaceHolder holder) {
          // Surface will be destroyed when we return, so stop the preview.
          // Because the CameraDevice object is not a shared resource, it's very
          // important to release it when the activity is paused.
          mCamera.stopPreview();
          mCamera.release();
          mCamera = null;
      }
  
  
      private Size getOptimalPreviewSize(List&lt;Size&gt; sizes, int w, int h) {
          final double ASPECT_TOLERANCE = 0.05;
          double targetRatio = (double) w / h;
          if (sizes == null) return null;
  
          Size optimalSize = null;
          double minDiff = Double.MAX_VALUE;
  
          int targetHeight = h;
  
          // Try to find an size match aspect ratio and size
          for (Size size : sizes) {
              double ratio = (double) size.width / size.height;
              if (Math.abs(ratio - targetRatio) &gt; ASPECT_TOLERANCE) continue;
              if (Math.abs(size.height - targetHeight) &lt; minDiff) {
                  optimalSize = size;
                  minDiff = Math.abs(size.height - targetHeight);
              }
          }
  
          // Cannot find the one match the aspect ratio, ignore the requirement
          if (optimalSize == null) {
              minDiff = Double.MAX_VALUE;
              for (Size size : sizes) {
                  if (Math.abs(size.height - targetHeight) &lt; minDiff) {
                      optimalSize = size;
                      minDiff = Math.abs(size.height - targetHeight);
                  }
              }
          }
          return optimalSize;
      }
  
      public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
          // Now that the size is known, set up the camera parameters and begin
          // the preview.
          Camera.Parameters parameters = mCamera.getParameters();
  
          List&lt;Size&gt; sizes = parameters.getSupportedPreviewSizes();
          Size optimalSize = getOptimalPreviewSize(sizes, w, h);
          parameters.setPreviewSize(optimalSize.width, optimalSize.height);
  
          mCamera.setParameters(parameters);
          mCamera.startPreview();
      }
  
  }
  </code></pre>
  
  <p>As you can see, I use the Preview class from the CameraPreview example that can be found in the docs. Here's my layout:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical" android:layout_width="fill_parent"
      android:layout_height="fill_parent" android:id="@+id/layout"&gt;
      &lt;TextView android:layout_width="fill_parent"
          android:layout_height="wrap_content" android:text="Camera Demo"
          android:textSize="24sp" /&gt;
  
      &lt;FrameLayout android:id="@+id/preview"
          android:layout_weight="1" android:layout_width="fill_parent"
          android:layout_height="fill_parent"&gt;
      &lt;/FrameLayout&gt;
  
      &lt;Button android:layout_width="wrap_content"
          android:layout_height="wrap_content" android:id="@+id/buttonClick"
          android:text="Click" android:layout_gravity="center"&gt;&lt;/Button&gt;
  
  &lt;/LinearLayout&gt;
  </code></pre>
  
  <p>So what I'm doing is creating the surface and then trying to add it to the layout inside of the preview FrameLayout. It's not working though. It crashes right away. Help would be awesome!</p>
  
  <p>Here is my manifest:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.commonsware.android.skeleton"
        android:versionCode="1"
        android:versionName="1.0"&gt;
      &lt;uses-sdk android:minSdkVersion="8" /&gt;
  
      &lt;application android:icon="@drawable/icon" android:label="@string/app_name"&gt;
          &lt;activity android:name=".SimpleBulbActivity"
                    android:label="@string/app_name"&gt;
              &lt;intent-filter&gt;
                  &lt;action android:name="android.intent.action.MAIN" /&gt;
                  &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
              &lt;/intent-filter&gt;
          &lt;/activity&gt;
  
      &lt;/application&gt;
      &lt;uses-permission android:name="android.permission.CAMERA" /&gt;
      &lt;uses-feature android:name="android.hardware.camera" /&gt;
      &lt;uses-feature android:name="android.hardware.camera.autofocus" /&gt;
  &lt;/manifest&gt;
  </code></pre>
  
  <p>Apologies, here is the entire logcat. I see two exceptions in there, so maybe that's what's causing it?</p>
  
  <pre><code>12-20 16:16:10.843: ERROR/BatteryService(68): usbOnlinePath not found
  12-20 16:16:10.843: ERROR/BatteryService(68): batteryVoltagePath not found
  12-20 16:16:10.843: ERROR/BatteryService(68): batteryTemperaturePath not found
  12-20 16:16:10.883: ERROR/SurfaceFlinger(68): Couldn't open /sys/power/wait_for_fb_sleep or /sys/power/wait_for_fb_wake
  12-20 16:16:11.003: ERROR/SensorService(68): couldn't open device for module sensors (Invalid argument)
  12-20 16:16:15.923: ERROR/System(68): Failure starting core service
  12-20 16:16:15.923: ERROR/System(68): java.lang.SecurityException
  12-20 16:16:15.923: ERROR/System(68):     at android.os.BinderProxy.transact(Native Method)
  12-20 16:16:15.923: ERROR/System(68):     at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:146)
  12-20 16:16:15.923: ERROR/System(68):     at android.os.ServiceManager.addService(ServiceManager.java:72)
  12-20 16:16:15.923: ERROR/System(68):     at com.android.server.ServerThread.run(SystemServer.java:206)
  12-20 16:16:15.953: ERROR/EventHub(68): could not get driver version for /dev/input/mouse0, Not a typewriter
  12-20 16:16:15.953: ERROR/EventHub(68): could not get driver version for /dev/input/mice, Not a typewriter
  12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/Effect_Tick.ogg
  12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressStandard.ogg
  12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressSpacebar.ogg
  12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressDelete.ogg
  12-20 16:16:16.564: ERROR/SoundPool(68): error loading /system/media/audio/ui/KeypressReturn.ogg
  12-20 16:16:16.623: ERROR/UsbObserver(68): java.lang.NullPointerException
  12-20 16:16:16.623: ERROR/UsbObserver(68):     at com.android.server.UsbObserver.init(UsbObserver.java:131)
  12-20 16:16:16.623: ERROR/UsbObserver(68):     at com.android.server.UsbObserver.&lt;init&gt;(UsbObserver.java:65)
  12-20 16:16:16.623: ERROR/UsbObserver(68):     at com.android.server.ServerThread.run(SystemServer.java:402)
  12-20 16:16:17.233: ERROR/ThrottleService(68): Could not open GPS configuration file /etc/gps.conf
  12-20 16:16:20.224: ERROR/logwrapper(160): executing /system/bin/tc failed: No such file or directory
  12-20 16:16:20.324: ERROR/logwrapper(162): executing /system/bin/tc failed: No such file or directory
  12-20 16:16:20.394: ERROR/logwrapper(163): executing /system/bin/tc failed: No such file or directory
  12-20 16:16:58.542: ERROR/AndroidRuntime(326): FATAL EXCEPTION: main
  12-20 16:16:58.542: ERROR/AndroidRuntime(326): java.lang.RuntimeException: Unable to resume activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity}: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2095)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2110)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1643)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.os.Handler.dispatchMessage(Handler.java:99)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.os.Looper.loop(Looper.java:123)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.ActivityThread.main(ActivityThread.java:3647)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at java.lang.reflect.Method.invokeNative(Native Method)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at java.lang.reflect.Method.invoke(Method.java:507)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at dalvik.system.NativeStart.main(Native Method)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326): Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.Activity.performResume(Activity.java:3835)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2085)
  12-20 16:16:58.542: ERROR/AndroidRuntime(326):     ... 12 more
  12-20 16:17:19.592: ERROR/AndroidRuntime(355): FATAL EXCEPTION: main
  12-20 16:17:19.592: ERROR/AndroidRuntime(355): java.lang.RuntimeException: Unable to resume activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity}: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2095)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2110)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1643)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.os.Handler.dispatchMessage(Handler.java:99)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.os.Looper.loop(Looper.java:123)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.ActivityThread.main(ActivityThread.java:3647)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at java.lang.reflect.Method.invokeNative(Native Method)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at java.lang.reflect.Method.invoke(Method.java:507)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at dalvik.system.NativeStart.main(Native Method)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355): Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.Activity.performResume(Activity.java:3835)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2085)
  12-20 16:17:19.592: ERROR/AndroidRuntime(355):     ... 12 more
  12-20 16:18:11.932: ERROR/AndroidRuntime(365): FATAL EXCEPTION: main
  12-20 16:18:11.932: ERROR/AndroidRuntime(365): java.lang.RuntimeException: Unable to resume activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity}: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2095)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2110)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1643)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.ActivityThread.access$1500(ActivityThread.java:117)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:928)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.os.Handler.dispatchMessage(Handler.java:99)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.os.Looper.loop(Looper.java:123)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.ActivityThread.main(ActivityThread.java:3647)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at java.lang.reflect.Method.invokeNative(Native Method)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at java.lang.reflect.Method.invoke(Method.java:507)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at dalvik.system.NativeStart.main(Native Method)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365): Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.Activity.performResume(Activity.java:3835)
  12-20 16:18:11.932: ERROR/AndroidRuntime(365):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2085)
  </code></pre>