如何在Android中启动应用程序时自动捕获图像?

时间:2014-05-17 05:23:29

标签: android image camera capture

嗨朋友我正在处理申请。

在该应用应用程序启动时,应自动从相机中捕获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()事件中运行,并且应用程序停止运行。

请告诉解决方案。

谢谢。

2 个答案:

答案 0 :(得分:1)

致电

时,您的SurfaceView尚未创建

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


因此当时相机为空 ..

尝试在一些dealy之后调用它。

  @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 
        );


    }

这对我来说很完美...... 希望它也适合你。祝你好运:)

答案 1 :(得分:0)

此代码用于在应用程序启动时以固定的时间间隔自动捕获图像,无需用户界面。

    private int mInterval = 3000; // 3 seconds delay
    private Handler mHandler;
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mHandler = new Handler();
            mStatusChecker.run();
            mCamera = getCameraInstance();
            mPreview = new CameraPreview(this, mCamera);
            preview.addView(mPreview);
    }

    Runnable mStatusChecker = new Runnable() {
        @Override
        public void run() {
            try {
                 if(mCamera==null){
                    mCamera = getCameraInstance();
                  }
                 mCamera.takePicture(null, null, mPicture);
                }
            finally {
                // picture will be taken with each mInterval time
                mHandler.postDelayed(mStatusChecker, mInterval);
                }
          }
   }

此处还添加了预览,其中应单独创建预览表面。