Android自定義相機實現N連拍
阿新 • • 發佈:2019-01-08
/**
* 描述:自動連續拍照
* 開發者:開發者的樂趣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";
}
}