2017-02-06 7 views
0

私のアプリケーションには2つのメソッドが実装されています。最初の、dispatchTakePictureIntentはstartActivityForResultを呼び出します。だから私の活動が終わったら、私はonActivityResultに戻ります。startActivityForResult for photo android

私のアプリケーションはイベントを使用しているので、特定のイベントを受け取ったときにカメラを起動するので、写真を撮ることができます。問題は、私が写真を撮るには、私がアクティビティを開始した後で、ディスプレイに触れることなく、またリモートデバイスから別のイベントを受け取るだけでどうしたらいいですか?指を使わずに写真を撮る方法はありますか?

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 
     } 
     } 
    }; 
    } 
} 

おかげ

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

は、だから私はこのコードを使用し、私はシステムコールを行う必要がありonActivityResult ..

@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; 
    } 
} 
+0

これはカスタムカメラを実装することで可能です。上記のコードはそれを助けませんでした。リンク:https://github.com/googlesamples/android-Camera2Basicをご覧ください。 –

答えて

0

私は、BroadcastReceiverを通してIntentsを受け取るカスタムCameraを実装しました。

以下のクラスは意図を持って開始することができ、写真を撮る、保存する、カメラを切り替える(前/後)、またはインテントを取得してmainActivityに戻ることができます。

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

} 
    } 
0

は私のアプリでそれをやったと仮定しますコードはhereです。私のアプリでそれを多く変更していませんでした。

関連する問題