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(, );//設定分辨率
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(, ); //設定每秒顯示幀
parameters.setPictureSize(width, height); // 設定儲存的圖檔尺寸
parameters.setJpegQuality(); // 設定照片品質
mCamera.setParameters(parameters);
}
// 停止拍照時調用該方法
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCamera != null) {
mCamera.stopPreview();
mCamera.release(); // 釋放照相機
mCamera = null;
}
}
}
3 拍照并存儲照片
3.1 拍照函數
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, , data.length);
Matrix matrix = new Matrix();
matrix.setRotate( - mAdjustDegree);
bitmap = Bitmap.createBitmap(bitmap, , , bitmap.getWidth(), bitmap.getHeight(), matrix, true);
FileOutputStream fos = new FileOutputStream(file.getPath());
bitmap.compress(Bitmap.CompressFormat.JPEG, , fos);
fos.close();
}