如何让我的相机在Android中以编程方式拍照?

时间:2014-02-13 09:26:41

标签: android android-camera

我不希望我的应用程序调用本机相机应用程序。我想要的是让我的应用程序在应用程序启动时以编程方式拍摄照片而无需任何用户交互或参与。

这是我的代码:

public class CameraActivity extends Activity implements SurfaceHolder.Callback{


     Camera camera;
     PictureCallback rawCallback;
     ShutterCallback shutterCallback;
     PictureCallback jpegCallback;
     ImageView view;

     boolean inPreview = false;

    @SuppressLint("NewApi")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        view = (ImageView)findViewById(R.id.pic);

        Log.e("Camera Status: ",String.valueOf(checkCameraHardware(getApplicationContext())));
        Log.e("Number Of Cameras: ",String.valueOf(Camera.getNumberOfCameras()));

        start_camera();
        captureImage();

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

            /** Handles data for jpeg picture */
            shutterCallback = new ShutterCallback() {
                public void onShutter() {
                    Log.i("Log", "onShutter'd");
                }
            };

            jpegCallback = new PictureCallback() {
                public void onPictureTaken(byte[] data, Camera camera) {
                    //Set the Image to ImageView
                    Bitmap bitmapPicture
                   = BitmapFactory.decodeByteArray(data, 0, data.length); 
                    //view.setImageBitmap(bitmapPicture);

                //Save the Image to SD Card 
                    FileOutputStream outStream = null;
                    try {
                        outStream = new FileOutputStream(String.format(
                                "/sdcard/%d.jpg", System.currentTimeMillis()));
                        outStream.write(data);
                        outStream.close();
                        Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } finally {
                    }
                    Log.d("Log", "onPictureTaken - jpeg");



                    /**
                     * The two lines below are used to refresh the Surface View 
                     * It works quickly then the general refresh by Default
                     **/
                    stop_camera();
                    start_camera();
                }
            };

        //start_camera();

    }


    /** Check if this device has a camera */
    private boolean checkCameraHardware(Context context) {
        if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
            // this device has a camera
            return true;
        } else {
            // no camera on this device
            return false;
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }


    public static Camera getCameraInstance(){
        Camera c = null;
        try {
            c = Camera.open(); // attempt to get a Camera instance
        }
        catch (Exception e){
            // Camera is not available (in use or does not exist)
        }
        return c; // returns null if camera is unavailable
    }


      private void start_camera()
        {
            try{
                camera = Camera.open();
                Log.e("Camera Open Status: ", "Camera opened successfully");
            }catch(RuntimeException e){
                Log.e("Camera Initialization:", "init_camera: " + e);
                return;
            }
            Camera.Parameters param;
            param = camera.getParameters();
            //modify parameter
            param.setPreviewFrameRate(20);
            param.setPreviewSize(176, 144);
            camera.setParameters(param);
            try {
                //camera.setPreviewDisplay(surfaceHolder);
                camera.startPreview();
                //camera.takePicture(shutter, raw, jpeg)
            } catch (Exception e) {
                Log.e("Camera Initialization:", "init_camera: " + e);
                return;
            }
            inPreview=true;
        }


      private void captureImage() {
            // TODO Auto-generated method stub
            AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
            mgr.setStreamMute(AudioManager.STREAM_SYSTEM, true);

            camera.takePicture(shutterCallback, rawCallback, jpegCallback);
            Log.e("Picture Status: ","picture taken successfully");
            final Handler handler = new Handler();
            Timer t = new Timer();
            t.schedule(new TimerTask() {
                public void run() {
                    handler.post(new Runnable() {
                        public void run() {
                        AudioManager mgr = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
                        mgr.setStreamMute(AudioManager.STREAM_SYSTEM, false);
                                }
                            });
                        }
                }, 1000); 


        }

      private void stop_camera()
        {
            camera.stopPreview();
            camera.release();
            inPreview = false;
        }


    @Override
    public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
        // TODO Auto-generated method stub

    }


    @Override
    public void surfaceCreated(SurfaceHolder arg0) {
        // TODO Auto-generated method stub

    }


    @Override
    public void surfaceDestroyed(SurfaceHolder arg0) {
        // TODO Auto-generated method stub

    }

}

enter image description here

1 个答案:

答案 0 :(得分:1)

下载项目表单here CameraLibrary 复制到工作区

将这些添加到您的清单

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="10" />
<uses-features android:name="android.hardware.camera"/>
<uses-permission android:name="android.permission.CAMERA"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<activity android:name="com.girish.cameraLibrary.CameraClass"></activity>

现在,在您的活动中实现com.girish.cameraLibrary.OnPictureTaken界面并覆盖pictureTaken(Bitmap bitmap, File file)方法,该方法为您提供位图和文件

现在创建和CustomCamera的实例

private CustomCamera mCustomCamera;

mCustomCamera = new CustomCamera(MainActivity.this);
mCustomCamera.setPictureTakenListner(this);

//To start the custom back camera use this
mCustomCamera.startCamera();
//To send an intent to applications who are listening to Camera request
mCustomCamera.sendCameraIntent();
//To start the front camera use this
mCustomCamera.startCameraFront();

现在您可以使用pictureTaken(Bitmap bitmap, File file)方法访问图像,因此只需使用

即可
imageview.setImageBitmap(bitmap);

修改

假设您的主类被称为MainActivity这样的写作

public class MainActivity extends Activity implements OnPictureTaken {

.....
.....
.....

@Override
protected void onCreate(Bundle savedInstanceState) {
.....
.....
.....


//This is where you get the picture
@Override
public void pictureTaken(Bitmap bitmap, File file) {
    imgCapture.setImageBitmap(bitmap);
    txtPath.setText(file.getAbsolutePath());
}

按照提到的here

检查示例文件