首页 > 系统 > Android > 正文

Android自定义相机

2019-11-08 00:37:09
字体:
来源:转载
供稿:网友

Android自定义相机Camera+SurfaceView

<1>界面使用SurfaceView控件,显示照相机的画面 <2>SurfaceView接受摄像头界面变化的信息 surfaceView.getHolder().addCallback() <3>重写三个方法 surfaceDestroyed—>当预览界面关闭时,触发 一般在这里执行销毁照相机的操作,释放内存 camera.stopPReview(); camera.release(); camera = null; surfaceCreated—–>预览界面被创建时,调用 一般在这里打开照相机和设置照相机的一些参数

// 打开摄像头 camera = Camera.open(); // 给摄像头设置参数 Parameters parameters = camera.getParameters(); // 设置每秒3栈 parameters.setPreviewFrameRate(3); // 设置照片的输出格式 parameters.setPictureFormat(PixelFormat.JPEG); // 设置照片的质量 parameters.set("jpeg-quality", 85); // 给照相机设置参数 camera.setParameters(parameters); //将摄像头的画面显示到SurfaceView控件上 camera.setPreviewDisplay(sv_main_camera.getHolder()); // 开始预览 camera.startPreview(); surfaceChanged----->当预览界面的格式和大小发生改变时,触发<4>保存 camera.takePicture 将照片保存到内存卡(压缩)

还是老规矩先看效果图: 这里写图片描述

摄像头是手机硬件部分,所以要加权限:

<uses-permission android:name="android.permission.RECORD_AUDIO"/>

下面看代码:

public class CameraActivity extends AppCompatActivity { private SurfaceView sv_camera_surfaceview; private Camera camera; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_camera); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); } //获取SurfaceView sv_camera_surfaceview = (SurfaceView) findViewById(R.id.sv_camera_surfaceview); sv_camera_surfaceview.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder surfaceHolder) { //打开摄像头 camera = Camera.open(); //设置相机参数 Camera.Parameters parameters=camera.getParameters(); parameters.setPictureFormat(PixelFormat.JPEG);// 设置照片的输出格式 parameters.set("jpeg-quality",85);// 设置照片的质量 camera.setParameters(parameters);// 给照相机设置参数 mySetDisplayOrientation(CameraActivity.this,0); //讲摄像头的画面展示到SurfaceView try { camera.setPreviewDisplay(sv_camera_surfaceview.getHolder()); } catch (IOException e) { e.printStackTrace(); } //开启预览 camera.startPreview(); } @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { } }); } //拍照的方法 public void getImage(View view){ camera.takePicture(null, null, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] bytes, Camera camera) { Bitmap bitmap=BitmapFactory.decodeByteArray(bytes,0,bytes.length); //将字节数组转成图片 try { String sdPath= Environment.getExternalStorageDirectory().getAbsolutePath(); FileOutputStream fos=new FileOutputStream(sdPath+"/taoge"+System.currentTimeMillis()+".png"); Log.i("test",sdPath); bitmap.compress(Bitmap.CompressFormat.PNG,85,fos); camera.stopPreview(); camera.startPreview(); } catch (FileNotFoundException e) { e.printStackTrace(); } } }); } private void mySetDisplayOrientation(Activity activity, int cameraId) { // 调整摄像头方向 Camera.CameraInfo info = new Camera.CameraInfo(); Camera.getCameraInfo(cameraId, info); int rotation = activity.getWindowManager().getDefaultDisplay() .getRotation(); int degrees = 0; switch (rotation) { case Surface.ROTATION_0: degrees = 0; break; case Surface.ROTATION_90: degrees = 90; break; case Surface.ROTATION_180: degrees = 180; break; case Surface.ROTATION_270: degrees = 270; break; } int result; if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { result = (info.orientation + degrees) % 360; result = (360 - result) % 360; // compensate the mirror } else { // back-facing result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); } @Override protected void onDestroy() { super.onDestroy(); //当界面关闭时,关闭相机 camera.stopPreview(); camera.release(); }}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表