Camera開重點內容發準備工作:
1.權限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.預覽視圖
2.1 SurfaceView的設置
SurfaceView surfaceView ;//獲取一個SurfaceView實例,可以在佈局中聲明
surfaceView.getHolder().setKeepScreenOn(true);// 屏幕常亮
surfaceView.getHolder().setFixedSize(640, 640);//設置分辨率
surfaceView.getHolder().addCallback(new SurfaceCallback());//添加一個回調函數 <**重點**>
2.2 SurfaceView(回調函數)和Camera的綁定
private class SurfaceCallback implements SurfaceHolder.Callback {
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK); // 打開攝像頭
mCamera.setPreviewDisplay(holder); // 設置預覽的試圖對象
//根據屏幕方向 調整 相機方向(橫屏時一切正常,豎屏需要調整,旋轉90°)
mAdjustDegree = adjustDegree(MainActivity.this);
mCamera.setDisplayOrientation(mAdjustDegree);
mCamera.startPreview(); // 開始預覽
} catch (Exception e) {
e.printStackTrace();
}
}
// 拍照狀態變化時(以及頁面剛顯示的時候)調用該方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
parameters = mCamera.getParameters(); // 獲取各項參數
parameters.setPictureFormat(ImageFormat.JPEG); // 設置圖片格式
parameters.setPreviewSize(width, height); // 設置預覽大小
parameters.setPreviewFpsRange(4, 6); //設置每秒顯示幀
parameters.setPictureSize(width, height); // 設置保存的圖片尺寸
parameters.setJpegQuality(100); // 設置照片質量
mCamera.setParameters(parameters);
}
// 停止拍照時調用該方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release(); // 釋放照相機
mCamera = null;
}
}
}
3 拍照並存儲照片
3.1 拍照函數
mCamera.takePicture(null, null, new MyPictureCallback());//第一個參數,快門完成回調,可以做一些聲音播放等處理工作,最後一個拍照完成回調,回調函數中包含一個Byte數據,可以使用數據讀取到文件中完成存儲
3.2 拍照結果
private class MyPictureCallback implements Camera.PictureCallback {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
saveToSDCard(data); // 保存圖片到sd卡中
camera.startPreview(); // 拍完照後,重新開始預覽
} catch (Exception e) {
e.printStackTrace();
}
}
}
extra:保存照片的方法給出
private void saveToSDCard(byte[] data) throws IOException {
//使用當前時間作爲保存圖片的名字
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss"); // 格式化時間
filename = format.format(date) + ".jpg";
File dir = new File(Environment.getExternalStorageDirectory()
+ "/pic/");
if (!dir.exists()) {
dir.mkdir();
}
file = new File(dir, filename);
if (!file.exists()) {
file.createNewFile();
}
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix matrix = new Matrix();
matrix.setRotate(180 - mAdjustDegree);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
FileOutputStream fos = new FileOutputStream(file.getPath());
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
fos.close();
}