1. 程式人生 > >Android自定義相機實現N連拍

Android自定義相機實現N連拍

/** * 描述:自動連續拍照 * 開發者:開發者的樂趣JRT * 建立時間:2017-3-15 19:16 * CSDN地址:http://blog.csdn.net/Jiang_Rong_Tao/article * E-mail:[email protected] **/ public class AutoTakePicturesActivity extends AppCompatActivity implements SurfaceHolder.Callback{ private static final String TAG = "AutoTakePicturesActivity"
; private SurfaceView mSurfaceView; private Camera mCamera; private SurfaceHolder mSurfaceViewHolder; private int mPictureCount=3;//預設自動拍一張 private final int mPictureCountMax=30;//預設自動拍一張 int pic_count=0; private ArrayList<String> mPicturePaths; private String mPath; @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_auto_take_pictures); init(); } private void init() { mPicturePaths=new ArrayList<String>(); mSurfaceView = (SurfaceView) findViewById(R.id.surface_view); //獲取SurfaceHolder
mSurfaceViewHolder = mSurfaceView.getHolder(); mSurfaceViewHolder.addCallback(this); //觸控式螢幕幕完成對焦 mSurfaceView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mCamera.autoFocus(null); //平滑的縮放:取值在0~mCamera.getParameters().getMaxZoom() // mCamera.startSmoothZoom(2); } }); } private void startCapture(){ if (mCamera != null) { Camera.Parameters parameters = mCamera.getParameters(); //設定拍照的圖片格式 parameters.setPictureFormat(ImageFormat.JPEG); //設定圖片的預覽大小 parameters.setPreviewSize(200, 300); //設定自動對焦 parameters.setFocusMode(Camera.Parameters.ANTIBANDING_AUTO); mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { //動態對對焦成功後,獲取拍攝的圖片 if (success) { camera.takePicture(null, null, mPictureCallback); } } }); } } /** * 拍攝成功後對圖片的處理 */ private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { @SuppressLint("LongLogTag") @Override public void onPictureTaken(byte[] data, Camera camera) { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { FileOutputStream fileOutputStream = null; try { File file = new File(Environment.getExternalStorageDirectory() , getPhotoFileName()); mPath = file.getAbsolutePath(); Log.i(TAG, "onPictureTaken: " + mPath); fileOutputStream = new FileOutputStream(file); fileOutputStream.write(data); } catch (Exception e) { e.printStackTrace(); Toast.makeText(AutoTakePicturesActivity.this, "圖片儲存失敗", Toast.LENGTH_SHORT).show(); } finally { if (fileOutputStream != null) { try { if (mPictureCount>mPictureCountMax){ Toast.makeText(AutoTakePicturesActivity.this,"為了節約記憶體,連拍張數不要超過"+mPictureCountMax+"張", Toast.LENGTH_SHORT).show(); }else { if (++pic_count<mPictureCount){ //連拍三張 mPicturePaths.add(mPath); setStartPreview(mCamera, mSurfaceViewHolder); }else { mPicturePaths.add(mPath);//最後一張圖片加入集合 Intent intent = new Intent().putStringArrayListExtra(Contast.PICTURE_PATHS, mPicturePaths); setResult(RESULT_OK,intent); fileOutputStream.close(); //保證最後一張圖片加入集合並優化使用者體驗 SystemClock.sleep(2000); finish(); } Toast.makeText(AutoTakePicturesActivity.this, "圖片儲存成功"+pic_count+"張", Toast.LENGTH_SHORT).show(); } } catch (IOException e) { e.printStackTrace(); } } } } else { Toast.makeText(AutoTakePicturesActivity.this, "SD不存在,圖片儲存失敗", Toast.LENGTH_SHORT).show(); } } }; /** * 獲取Camera物件 * * @return */ private Camera getCamera() { mCamera = Camera.open(); return mCamera; } /** * 設定並且開啟相機預覽 */ private void setStartPreview(Camera camera, SurfaceHolder holder) { try { //將Camera與SurfaceView開始繫結 camera.setPreviewDisplay(holder); //調整拍攝的方向(預設橫屏) camera.setDisplayOrientation(90);//旋轉90度 //開啟預覽 camera.startPreview(); startCapture(); } catch (IOException e) { e.printStackTrace(); } } /** * 釋放Camera資源 */ private void releaseCamera() { if (mCamera != null) { mCamera.setPreviewCallback(null);//取消回撥 stopPreview(); mCamera.release(); mCamera = null; } } /** * 停止取景 */ private void stopPreview() { mCamera.stopPreview(); } /** * 將Camera和Activity的生命週期繫結 */ @Override protected void onResume() { super.onResume(); if (mCamera == null) { mCamera = getCamera(); if (mSurfaceViewHolder != null) { setStartPreview(mCamera, mSurfaceViewHolder); } } } @Override protected void onPause() { super.onPause(); releaseCamera(); } /** * SurfaceHolder 的回撥處理 * * @param surfaceHolder */ @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { Log.i(TAG, "surfaceCreated: "); setStartPreview(mCamera, mSurfaceViewHolder); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { Log.i(TAG, "surfaceChanged: "); stopPreview();//先停止取景,再重新開啟 setStartPreview(mCamera, mSurfaceViewHolder); } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { Log.i(TAG, "surfaceDestroyed: "); releaseCamera(); } // 使用系統當前日期加以調整作為照片的名稱 private String getPhotoFileName() { Date date = new Date(System.currentTimeMillis()); SimpleDateFormat dateFormat = new SimpleDateFormat( "'IMG'_yyyyMMdd_HHmmss"); return dateFormat.format(date) + ".jpg"; } }