Android(安卓)Camera应用初探二
16lz
2021-01-25
调用了系统的Camera之后,现在来自定义一个Camera,步骤如下:
1、Detect and Access Camera检查Camera是否可用并且打开Camera
检查Camera代码:
/** 检查设备是否有摄像头的功能 */ private boolean checkCameraHardware(Context context) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ // 该设备具有摄像头的功能 return true; } else { // 该设备没有摄像头的功能 return false; } }
打开Camera的代码
/** 下面的方法是比较安全方法 */ public static Camera getCameraInstance(){ Camera c = null; try { c = Camera.open(); // 视图去打开Camera的实例 } catch (Exception e){ // Camera不可用或者Camera正在被其它的应用使用 } return c; // 如果不可用则返回null}
2、Create a Preview Class创建一个预览类
public class MyCustomCamera extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public MyCustomCamera(Context context, Camera camera) { super(context); this.mCamera = camera; mHolder = getHolder();//该SurfaceHolder存在与onCreate和onDestroy方法之间 mHolder.addCallback(this);//为SurfaceHolder设置回调方法 mHolder.setKeepScreenOn(true);//屏幕显示高亮(这里的高亮是),不锁屏 mHolder.setFixedSize(800, 480);//设置展示预览的分辨率 // 过期的方法,如果想兼容低于3.0一下的版本需要加上 mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } /** * 开启预览 * * @param camera * @param holder */ private void setStartPreview(Camera camera, SurfaceHolder holder) throws IOException { if (camera != null && holder != null) { camera.setPreviewDisplay(holder); camera.setDisplayOrientation(90);//设置竖直预览 camera.startPreview();//开启预览 } } @Override public void surfaceCreated(SurfaceHolder holder) { //SurfaceView创建 try { setStartPreview(mCamera, holder); } catch (IOException e) { //开启预览失败 } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { //Surface预览发生改变或者旋转的时候调用,在这里请确保在重新开启之前停止预览 if (mHolder.getSurface() == null) { // 预览的Surface不存在 return; } try { mCamera.stopPreview();//停止预览 } catch (Exception e) { //当停止预览发生异常的操作 } //设置预览参数的在这里设置 Camera.Parameters parameters = mCamera.getParameters(); //parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);//开启闪光灯模式 parameters.setPictureSize(800, 480);//设置图片的分辨率 parameters.setPreviewSize(800, 480);//设置图片预览的分辨率 parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);//设置对焦模式为自动对焦// parameters.flatten();返回一个字符串,里面有关于拍照的配置信息 parameters.setPictureFormat(ImageFormat.JPEG);//设置图片的格式 parameters.setJpegQuality(100);//设置图片的质量 parameters.setPreviewFrameRate(5);//预览每秒五针 mCamera.setParameters(parameters); try { setStartPreview(mCamera, holder); } catch (IOException e) { //开启预览失败 } } @Override public void surfaceDestroyed(SurfaceHolder holder) { //这里不做处理,让Activity关心释放资源的操作 }}
3、Build a Preview Layout 构建预览布局文件
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <FrameLayout android:id="@+id/camera_preview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> <Button android:id="@+id/button_capture" android:text="拍照" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /></LinearLayout>
4、Setup Listeners for Capture 设置监听事件来捕获监听
@Overridepublic void onClick(View v) { //Camera对焦的回调 mCamera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { //当对焦成功之后调用拍照 takePicture(); } } });}/** * 拍照 */private void takePicture() { mCamera.takePicture(new Camera.ShutterCallback() { @Override public void onShutter() { //当按下快门的时候调用 } }, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { //得到拍照没有压缩的图片 } }, new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { //得到压缩之后的图片 //拍照之后回调的方法,在这里经常会存储图片 File file = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"app.png"); //该路径为:在sd目录下pictures/app.png try { FileOutputStream outputStream = new FileOutputStream(file); outputStream.write(data); outputStream.close(); } catch (Exception e) { e.printStackTrace(); } //拍照完成之后跳转到新的Activity Intent intent = new Intent(MainActivity.this,PreviewActivity.class); intent.putExtra("path", file.getAbsolutePath()); startActivity(intent); } });}
其中PreviewActivity是一个展示拍照的图片的功能:
iv = (ImageView) findViewById(R.id.iv);Intent intent = getIntent();String path = intent.getStringExtra("path");try { FileInputStream inputStream = new FileInputStream(path); Bitmap bitmap = BitmapFactory.decodeStream(inputStream);//得到图片,当这里需要对该图片进行翻转让它竖直呈现 Matrix matrix = new Matrix(); matrix.setRotate(90); Bitmap rotate_bitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); iv.setImageBitmap(rotate_bitmap);} catch (FileNotFoundException e) { e.printStackTrace();
代码下载地址:http://download.csdn.net/detail/weiwozhiyi/9387674
更多相关文章
- Android(安卓)逐帧动画isRunning 一直返回true的问题
- Android(安卓)ZoomControls缩放控件
- Android(安卓)网络显示图片 通过代理访问
- Android(安卓)Webkit简单用例
- Android热点、WiFi、蓝牙等功能开启和关闭
- 使用googleMap 需要获取的apikey方法
- Android(安卓)-- 重置Bitmap大小&&Bitmap转角度
- Android将“.c”后缀名改为“.cpp”时java调用native失败及“err
- 关于Gallery使用