调用了系统的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

更多相关文章

  1. Android(安卓)逐帧动画isRunning 一直返回true的问题
  2. Android(安卓)ZoomControls缩放控件
  3. Android(安卓)网络显示图片 通过代理访问
  4. Android(安卓)Webkit简单用例
  5. Android热点、WiFi、蓝牙等功能开启和关闭
  6. 使用googleMap 需要获取的apikey方法
  7. Android(安卓)-- 重置Bitmap大小&&Bitmap转角度
  8. Android将“.c”后缀名改为“.cpp”时java调用native失败及“err
  9. 关于Gallery使用

随机推荐

  1. Android重写菜单增加系统自带返回键
  2. LINUX下Android(安卓)NDK下载并配置
  3. 《Android开发从零开始》――22.数据存储
  4. Android实现ListView异步加载图片总结
  5. Android(安卓)ViewFliper实现屏幕切换
  6. android PhoneGap 自定义插件
  7. cocos2dx使用Jsoncpp在android运行的问题
  8. Android(安卓)adb 模拟滑动 按键 点击事
  9. android 3D 游戏实现之综合实例(初步)
  10. 解决Debug certificate expired问题