今天学习了android开发中的相机的开发,总结了关于android中相机的开发流程:
*使用surfaceview进行预览
*需要开启的权限<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
1.布局文件:
<SurfaceView
android:id="@+id/svPreview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2.为surfaceview设置callback
mSfPreview.getHolder().addCallback(new SfCallback());
public class SfCallback implements SurfaceHolder.Callback{
/**
* 设置相机属性
*/
void setCamera(){
Camera.Parameters parameters = mCamera.getParameters();
//得到相机支持的拍照分辨率,按大小排列(有的手机从大到小,有的从小到大)
List<Camera.Size> listSize = parameters .getSupportedPictureSizes();
// 从大到小排列的情况下,设置照片的大小,只能设置成支持的size,不能随意设置
//不同的机型,listSize中的值的顺序不同,需要查看本机在哪个值的时候最清晰
parameters.setPictureSize(listSize.get(0).width,listSize.get(0).height);
// 设置图片格式
parameters.setPictureFormat(ImageFormat.JPEG);
//默认情况下相机是横向的,这里只是改变预览的方向
mCamera.setDisplayOrientation(90);
//将参数设置到Camera对象中
mCamera.setParameters(parameters);
}
/**
* 创建的时候调用
* @param holder
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open();//打开相机
try {
setCamera();
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 状态改变的时候调用
* @param holder
* @param format
* @param width
* @param height
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
//自动对焦
mCamera.autoFocus(null);
}
/**
* 销毁的时候调用
* @param holder
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
//释放camera
if(mCamera != null){
mCamera.release();
mCamera = null;
}
}
}
3.拍照开始
@OnClick(R.id.btBegin)
public void capturePhoto(View view) {
/*第一个参数按下快门时回调,
*第二个参数处理原始的照片数据,
*第三个参数处理jpeg格式照片,一般用于存放照片
*/
mCamera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Bitmap bmSrc = BitmapFactory.decodeByteArray(data,
0,data.length);
Bitmap bmRotate = RotateBitmap(bmSrc);//旋转
saveBitmap(bmRotate);//保存
//重新开启预览
mCamera.startPreview();
}
});
}
3.1.旋转图片
/**
* 旋转照片
*
* @param bmSrc
*/
public Bitmap RotateBitmap(Bitmap bmSrc) {
Bitmap bmRotate = null;
Matrix matrix = new Matrix();
matrix.setRotate(90);//顺时针旋转90度
bmRotate = Bitmap.createBitmap(bmSrc, 0, 0,
bmSrc.getWidth(), bmSrc.getHeight(),matrix, true);
bmSrc.recycle();
return bmRotate;
}
3.2.保存照片
/**
* 保存图片
* @param bmToSave
*/
public void saveBitmap(Bitmap bmToSave) {
//以时间为文件名
SimpleDateFormat simpleDateFormat =
new SimpleDateFormat("yyyyMMddhhmmss");
String time = simpleDateFormat.format(new Date());
File file = new File("/sdcard/" + time + ".jpg");
BufferedOutputStream bufferedOutputStream = null;
try {
bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(file));
bmToSave.compress(Bitmap.CompressFormat.JPEG,
100,bufferedOutputStream);//将图片压缩到流中
bufferedOutputStream.flush();//输出缓冲区的内容到本地
bufferedOutputStream.close();//关闭
} catch (Exception e) {
e.printStackTrace();
}
}