自定义拍照
实现效果:
布局文件
<?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" />
新闻热点
疑难解答