嗨,朋友,我正在处理一个应用程序。

在该应用程序中,当应用程序启动时,Pic应该会自动从相机中捕获。

我的代码是:

1.相机演示

    public class CameraDemo extends Activity
    {
        private static final String TAG = "CameraDemo";
        Camera camera;
        Preview preview;
        Button buttonClick;
        Chronometer ch;

        /** Called when the activity is first created. */
        @Override


    public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);

            preview = new Preview(this);
            ((FrameLayout) findViewById(R.id.preview)).addView(preview);

            buttonClick = (Button) findViewById(R.id.buttonClick);
            ch=(Chronometer)findViewById(R.id.chronometer1);
            ch.start();

            preview.camera.takePicture(shutterCallback,rawCallback,jpegCallback);
// If I write above code here it shows error.

            buttonClick.setOnClickListener( new OnClickListener()
            {
                public void onClick(View v)
                {

                    buttonClick.setVisibility(View.INVISIBLE);
                    preview.camera.takePicture(shutterCallback, rawCallback,jpegCallback);
                               // Here it works perfactly
                    Toast.makeText(CameraDemo.this,""+ch.getText(), Toast.LENGTH_LONG).show();
                }
            });

            Log.d(TAG, "onCreate'd");
        }


        ShutterCallback shutterCallback = new ShutterCallback()
        {
            public void onShutter()
            {
                Log.d(TAG, "onShutter'd");
            }
        };

        /** Handles data for raw picture */
        PictureCallback rawCallback = new PictureCallback()
        {
            public void onPictureTaken(byte[] data, Camera camera)
            {
                Log.d(TAG, "onPictureTaken - raw");
            }
        };

        /** Handles data for jpeg picture */
        PictureCallback jpegCallback = new PictureCallback()
        {
            public void onPictureTaken(byte[] data, Camera camera)
            {
                FileOutputStream outStream = null;
                try
                {
                    // write to local sandbox file system
                    // outStream = CameraDemo.this.openFileOutput(String.format("%d.jpg", System.currentTimeMillis()), 0);
                    // Or write to sdcard
                    outStream = new FileOutputStream(String.format("/sdcard/tmp/%d.jpg", System.currentTimeMillis()));
                    outStream.write(data);
                    outStream.close();
                    Log.d(TAG, "onPictureTaken - wrote bytes: " + data.length);
                }
                catch (FileNotFoundException e)
                {
                    e.printStackTrace();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
                finally
                {
                }
                Log.d(TAG, "onPictureTaken - jpeg");
            }
        };

    }


2. Preview.java

package com.example;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Camera;
import android.hardware.Camera.PreviewCallback;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;


class Preview extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "Preview";

    SurfaceHolder mHolder;
    public Camera camera;

    @SuppressWarnings("deprecation")
    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.
        camera = Camera.open();
        try
        {
            camera.setPreviewDisplay(holder);

            camera.setPreviewCallback(new PreviewCallback()
            {

                public void onPreviewFrame(byte[] data, Camera arg1)
                {
                    FileOutputStream outStream = null;
                    try
                    {
                        outStream = new FileOutputStream(String.format("/sdcard/tmp/%d.jpg", System.currentTimeMillis()));
                        outStream.write(data);
                        outStream.close();
                        Log.d(TAG, "onPreviewFrame - wrote bytes: " + data.length);
                    }
                    catch (FileNotFoundException e)
                    {
                        e.printStackTrace();
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    finally
                    {
                    }
                        Preview.this.invalidate();
                }
            });
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    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.
        camera.stopPreview();
        camera = null;
    }

    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 = camera.getParameters();
        parameters.setPreviewSize(w, h);
        camera.setParameters(parameters);
        camera.startPreview();
    }

    @Override
    public void draw(Canvas canvas)
    {
            super.draw(canvas);
            Paint p= new Paint(Color.RED);
            Log.d(TAG,"draw");
            canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p );
    }
}


为此,我给出了以上许可:

<uses-permission android:name="android.permission.CAMERA" />

我的错误日志是:

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example/com.example.CameraDemo}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2343)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2395)
    at android.app.ActivityThread.access$600(ActivityThread.java:162)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:194)
    at android.app.ActivityThread.main(ActivityThread.java:5371)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at com.example.CameraDemo.onCreate(CameraDemo.java:41)
    at android.app.Activity.performCreate(Activity.java:5122)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1081)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2307)
    ... 11 more


我的问题是:

当我在按钮单击事件中使用此代码时,它可以正常工作。但是,当我启动应用程序图像时,需要自动捕获图像。

相同的代码在onCreate()事件中不起作用,并且应用程序不幸地停止了。

请告诉这个解决方案。

谢谢。

最佳答案

呼叫时尚未创建您的SurfaceView

preview.camera.takePicture(shutterCallback,rawCallback,jpegCallback);

 所以当时相机是NULL。

尝试达成协议后再叫它。

  @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.camera);
        preview = new Preview(this);

        ((FrameLayout) findViewById(R.id.preview)).addView(preview);

        new java.util.Timer().schedule(
                new java.util.TimerTask() {
                    @Override
                    public void run() {
                        // your code here
                         preview.camera.takePicture(shutterCallback,rawCallback,jpegCallback);
                    }
                },
                2000
        );


    }


这对我来说很完美...
希望它也对您有用。祝您好运:)

08-18 08:54
查看更多