Android 用于拍摄照片的startActivityForResult

Android 用于拍摄照片的startActivityForResult,android,Android,我在我的应用程序中实现了两种方法。首先,DispatchTakePictureContent调用startActivityForResult。因此,当我的活动完成后,我会返回到ActivityResult 我的应用程序使用事件,因此当我收到特定事件时,我启动相机,以便拍照。问题是:在我开始活动后,如何在不触摸显示器的情况下,仅仅通过从远程设备接收另一个事件来拍摄照片?有没有什么方法可以代替手指拍照 谢谢 private void dispatchTakePictureIntent(int act

我在我的应用程序中实现了两种方法。首先,DispatchTakePictureContent调用startActivityForResult。因此,当我的活动完成后,我会返回到ActivityResult

我的应用程序使用事件,因此当我收到特定事件时,我启动相机,以便拍照。问题是:在我开始活动后,如何在不触摸显示器的情况下,仅仅通过从远程设备接收另一个事件来拍摄照片?有没有什么方法可以代替手指拍照

谢谢

private void dispatchTakePictureIntent(int actionCode) {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    switch(actionCode) {
    case ACTION_TAKE_PHOTO_B:
        File f = null;

        try {
            f = setUpPhotoFile();
            mCurrentPhotoPath = f.getAbsolutePath();
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
        } catch (IOException e) {
            e.printStackTrace();
            f = null;
            mCurrentPhotoPath = null;
        }
        break;

    default:
        break;          
    }
    startActivityForResult(takePictureIntent, actionCode);
}
所以我想我必须在ActivityResult上进行系统调用

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
    case ACTION_TAKE_PHOTO_B: {
        if (resultCode == RESULT_OK) {
            handleBigCameraPhoto();
        }
        break;
    }
        default:
            break;
    }
}

在我的应用程序中执行此操作,使用以下代码:

public void takePictureNoPreview(Context context){
  // open back facing camera by default
  Camera myCamera=Camera.open();

  if(myCamera!=null){
    try{
      //set camera parameters if you want to
      //...

      // here, the unused surface view and holder
      SurfaceView dummy=new SurfaceView(context)
      myCamera.setPreviewDisplay(dummy.getHolder());    
      myCamera.startPreview(); 

      myCamera.takePicture(null, null, getJpegCallback()):

    }finally{
      myCamera.close();
    }      

  }else{
    //booo, failed!
  }


  private PictureCallback getJpegCallback(){
    PictureCallback jpeg=new PictureCallback() {   
      @Override
      public void onPictureTaken(byte[] data, Camera camera) {
        FileOutputStream fos;
        try {
          fos = new FileOutputStream("test.jpeg");
          fos.write(data);
          fos.close();
        }  catch (IOException e) {
          //do something about it
        }
      }
    };
  }
}

代码来自于我没有在我的应用程序中多次修改它。

我实现了一个定制的摄像头,它通过广播接收器接收意图

下面的类可以带着意图开始,并允许拍照、保存、切换相机(后/前)或通过获取意图返回主活动

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera_preview);
    View myView= (View) findViewById(R.id.camera_previeww);
    myView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);

    cameraID= Camera.CameraInfo.CAMERA_FACING_FRONT;
    mCamera=openCamera(cameraID);
    mCamera.startPreview();

    IntentFilter filter = new IntentFilter();
    filter.addAction(Tabbed.BROADCAST_ACTION_TABBED);
    LocalBroadcastManager bm = LocalBroadcastManager.getInstance(this);
    bm.registerReceiver(mBroadcastReceiver, filter);


    // Create our Preview view and set it as the content of our activity.
    mPreview = new CameraPreview(this, mCamera);
    FrameLayout preview = (FrameLayout) this.findViewById(R.id.camera_previeww);
    preview.addView(mPreview);
}

private Camera.PictureCallback mPicture = new Camera.PictureCallback() {

    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE);
        if (pictureFile == null){
            Log.d(TAG, "Error creating media file, check storage permissions: ");
            return;
        }
        try {
            FileOutputStream fos = new FileOutputStream(pictureFile);
            fos.write(data);
            fos.close();

        } catch (FileNotFoundException e) {
            Log.d(TAG, "File not found: " + e.getMessage());
        } catch (IOException e) {
            Log.d(TAG, "Error accessing file: " + e.getMessage());
        }
        sleep(5000);
        camera.startPreview();
    }

};
private static File getOutputMediaFile(int type){

    File mediaStorageDir = new File(Environment.getExternalStorageDirectory(), "MyCameraApp");

    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
                "IMG_"+ timeStamp + ".jpg");
    }else {
        Log.d("MyCameraApp", "mediafile=null");
        System.out.println("mediafile=null");
        return null;
    }

    return mediaFile;
}
private static Uri getOutputMediaFileUri(int type){
    return Uri.fromFile(getOutputMediaFile(type));
}
public static final int MEDIA_TYPE_IMAGE = 1;

@Override
protected void onPause() {
    super.onPause();
    releaseCamera();              // release the camera immediately on pause event
}

private void releaseCamera(){
    if (mCamera != null){
        mCamera.stopPreview();
        mCamera.release();        // release the camera for other applications
        mCamera = null;
    }
}


private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        byte[] data = new byte[3];
        if (intent !=null && intent.getAction().equals(Tabbed.BROADCAST_ACTION_TABBED)) {
            data = intent.getByteArrayExtra(Tabbed.EXTRA_PARAM_BYTE);
        }
        if (data[FINGER] == MIDDLE_FINGER && data[TYPE] == SINGLE_TAP) {
            switchCamera();
            //releaseCamera();
            //mCamera=Camera.open();
        } else if (data[FINGER] == MIDDLE_FINGER && data[TYPE] == DOUBLE_TAP) {
            // HAVE TO GO BACK
            onBackPressed();
            //onPause();
            //finish();
        } else if (data[FINGER] == INDEX_FINGER && data[TYPE] == SINGLE_TAP) {
            mCamera.takePicture(null, null, mPicture);
        }

     // kill activity

    }
};
/*
@Override
public void onResume(){
    super.onResume();
    mCamera=openCamera(Camera.CameraInfo.CAMERA_FACING_FRONT);
}
     */
void kill_activity()
{
    mCamera.stopPreview();
    mCamera.setPreviewCallback(null);
    releaseCamera();
    finish();
}

public void switchCamera(){

    mCamera.stopPreview();
    releaseCamera();
    if (cameraID==Camera.CameraInfo.CAMERA_FACING_BACK){
        cameraID=Camera.CameraInfo.CAMERA_FACING_FRONT;
    }else{
        cameraID=Camera.CameraInfo.CAMERA_FACING_BACK;
    }

    mCamera=openCamera(cameraID);
    mCamera.startPreview();

    CameraPreview mPreview = new CameraPreview(this, mCamera);
    preview = (FrameLayout) this.findViewById(R.id.camera_previeww);
    preview.removeAllViews();
    preview.addView(mPreview);



}
public  Camera openCamera(int cameraIDD){
    Camera c=null;
    try{
        c=Camera.open(cameraIDD);
    }catch (Exception e){
        Log.d("Camera Activity", e.getMessage());
    }
    return c;

}
    }

您可以通过实现自定义摄影机来实现这一点。上面的代码没有帮助它。请参阅以下连结: