Android自定义相机触摸拍照

时间:2014-06-15 14:28:52

标签: android image camera frame ontouchlistener

我创建了一个自定义相机,可以在一帧内拍摄照片。但是我不打算使用按钮来拍摄照片,而是使用ontouch事件。我尝试了几次,但是一旦我放了一个onTouchListener,它就会崩溃。我应该用手势吗?

这是我的代码。

MainActivity -

public class MainActivity extends Activity {
private Camera mCamera;
private CameraPreview mCameraPreview;
private File pictureFile;
private Drawable d2;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    ImageView iv = new ImageView(this);
    iv.setImageResource(R.drawable.richard2);
    mCamera = getCameraInstance();
    mCameraPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
  //        final ImageView view = (ImageView) findViewById(R.id.imageView1);
    preview.addView(mCameraPreview);
    preview.addView(iv);    


    Button captureButton = (Button) findViewById(R.id.button_capture);
    captureButton.setOnClickListener(new View.OnClickListener() {
        @SuppressLint("NewApi")
        @Override
        public void onClick(View v) {
            mCamera.takePicture(null, null, mPicture);
            //File file1 = getOutputMediaFile();
            //Bitmap myBitmap = BitmapFactory.decodeFile(file1.getAbsolutePath());
            //Drawable drawable = new BitmapDrawable(getResources(), myBitmap);
            //view.setBackground(R.drawable.drawable);
            //view.setImageBitmap(myBitmap);

        }
    });
}

/**
 * Helper method to access the camera returns null if it cannot get the
 * camera or does not exist
 * 
 * @return
 */
private Camera getCameraInstance() {
    Camera camera = null;
    try {
        camera = Camera.open();
    } catch (Exception e) {
        // cannot get camera or does not exist
    }
    return camera;
}

PictureCallback mPicture = new PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {
        pictureFile = getOutputMediaFile();

        if (pictureFile == null) {
            return;
        }
        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();
        } catch (FileNotFoundException e) {

        } catch (IOException e) {
        }
    }
};

private static File getOutputMediaFile() {
    File mediaStorageDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "MyCameraApp");
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }
    // Create a media file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
            .format(new Date());
    File mediaFile;
    mediaFile = new File(mediaStorageDir.getPath() + File.separator
            + "IMG_" + timeStamp + ".jpg");

    return mediaFile;
   }
}

相机类 -

       public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback         {
     private SurfaceHolder mSurfaceHolder;
     private Camera mCamera;

       // Constructor that obtains context and camera
       @SuppressWarnings("deprecation")
       public CameraPreview(Context context, Camera camera) {
    super(context);
    this.mCamera = camera;
    this.mSurfaceHolder = this.getHolder();
    this.mSurfaceHolder.addCallback(this);
    this.mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
      }

      @Override
      public void surfaceCreated(SurfaceHolder surfaceHolder) {
      try {
  mCamera.setDisplayOrientation(90);
      mCamera.setPreviewDisplay(surfaceHolder);
      mCamera.startPreview();
      } catch (IOException e) {
       // left blank for now
       }
      }

      @Override
      public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
      mCamera.stopPreview();
      mCamera.release();
      }

   @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format,
       int width, int height) {
    // start preview with new settings
   try {
    mCamera.setPreviewDisplay(surfaceHolder);
    mCamera.startPreview();
   } catch (Exception e) {
     // intentionally left blank for a test
 }
 }
 }

最后,xml文件。

  <?xml version="1.0" encoding="utf-8"?>
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/container"
    android:orientation="vertical" >


<FrameLayout
    android:id="@+id/camera_preview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"

    />

<Button
    android:id="@+id/button_capture"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="9419K" />

  </LinearLayout>

1 个答案:

答案 0 :(得分:0)

我没有尝试的一件事就是放一个onclick听众,结果证明它有效。

 preview.setOnClickListener(new View.OnClickListener() {
       @SuppressLint("NewApi")
        @Override
        public void onClick(View v) {
           mCamera.takePicture(null, null, mPicture);
    }
});