Reputation: 5016
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:
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<Size> 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) > ASPECT_TOLERANCE) continue;
if (Math.abs(size.height - targetHeight) < 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) < 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<Size> sizes = parameters.getSupportedPreviewSizes();
Size optimalSize = getOptimalPreviewSize(sizes, w, h);
parameters.setPreviewSize(optimalSize.width, optimalSize.height);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
As you can see, I use the Preview class from the CameraPreview example that can be found in the docs. Here's my layout:
<?xml version="1.0" encoding="utf-8"?>
<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">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="Camera Demo"
android:textSize="24sp" />
<FrameLayout android:id="@+id/preview"
android:layout_weight="1" android:layout_width="fill_parent"
android:layout_height="fill_parent">
</FrameLayout>
<Button android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/buttonClick"
android:text="Click" android:layout_gravity="center"></Button>
</LinearLayout>
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!
Here is my manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.commonsware.android.skeleton"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SimpleBulbActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
</manifest>
Apologies, here is the entire logcat. I see two exceptions in there, so maybe that's what's causing it?
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.<init>(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)
Upvotes: 1
Views: 1654
Reputation: 1007533
You are not calling super.onResume()
in your onResume()
implementation:
Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()
Upvotes: 2