我使用相机的代码有什么问题?

时间:2011-12-20 21:03:51

标签: android camera

我对Android很新。我正在尝试使用带有图像叠加的相机。我看过很多讨论这个话题的主题,但他们仍然有点过头了。这是我的活动:

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();
    }

}

如您所见,我使用了可以在文档中找到的CameraPreview示例中的Preview类。这是我的布局:

<?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>

所以我正在做的是创建表面,然后尝试将其添加到预览FrameLayout内部的布局中。虽然不行。它马上就崩溃了。帮助太棒了!

这是我的清单:

<?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>

道歉,这是整个logcat。我在那里看到两个例外,所以也许这是导致它的原因?

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)

1 个答案:

答案 0 :(得分:2)

您未在super.onResume()实施中致电onResume()

Caused by: android.app.SuperNotCalledException: Activity {com.commonsware.android.skeleton/com.commonsware.android.skeleton.SimpleBulbActivity} did not call through to super.onResume()