自定义拍照
拍照实现步骤:
-
界面使用SurfaceView控件,显示照相机的画面
-
SurfaceView接受摄像头界面变化的信息
-
重写三个方法
-
保存
实现效果:
界面使用SurfaceView控件,显示照相机的画面
布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main"
android:layout_width="match_parent" android:layout_height="match_parent"
tools:context="com.example.p_.MainActivity">
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/sfv_mian"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拍照"
android:onClick="pz"
/>
</RelativeLayout>
SurfaceView接受摄像头界面变化的信息
//SurfaceView接受摄像头界面变化的信息
sfv_mian.getHolder().addCallback(new SurfaceHolder.Callback);//重写三个方法
重写三个方法
具体逻辑代码在三个方法中
//预览界面被创建时,调用一般在这里打开照相机和设置照相机的一些参数
@Override
public void surfaceCreated(SurfaceHolder surfaceHolder) {
//开启摄像头(Camera.open()就是后面摄像头,可以填参数的可以设置前后摄像头)
camera = Camera.open();
//给摄像头设置参数
Camera.Parameters parameters = camera.getParameters();
// 设置每秒3栈
//parameters.setPictureFormat(3);
// 设置照片的输出格式
parameters.setPictureFormat(PixelFormat.JPEG);
// 设置照片的质量(第一个参数:是规定了的,
// 第二个参数:0-100(越大越质量好,但是是根据手机像素,设置85差不多))
parameters.set("jpeg-quality",85);
// 给照相机设置参数
camera.setParameters(parameters);
//将摄像头的画面显示到SurfaceView控件上
try {
camera.setPreviewDisplay(sfv_mian.getHolder());
// 开始预览
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
//当预览界面的格式和大小发生改变时,触发
@Override
public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
}
//当预览界面关闭时,触发 一般在这里执行销毁照相机的操作,释放内存
@Override
public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
}
});
保存
当然保存要将字节转成Bitmap
//第一个参数:快门,第二个参数存放raw文件下,第三个参数想存到那就到那
camera.takePicture(null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] bytes, Camera camera) {
//将字节改变成图片
//压缩
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
try {
FileOutputStream fileOutputStream=new FileOutputStream("/mnt/sdcard/DCIM/王琰"+System.currentTimeMillis()+".png");
bitmap.compress(Bitmap.CompressFormat.PNG,85,fileOutputStream);
//停止
camera.stopPreview();
//重新拍照
camera.startPreview();
}catch (Exception e){
}
}
});
添加权限(清单文件)
第一个权限是照相机的权限
第二个权限是获取写文件的权限
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />