Media and Camera 中 Camera 模块

来源:互联网 发布:上位机软件开发 编辑:程序博客网 时间:2024/06/01 03:57

                       ( 附有案例代码) 

    Camera 

             使用前先明确清单,例如<uses-permissionandroid:name="android.permission.CAMERA"/> 和<uses-featureandroid:name="android.hardware.camera"/>和<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>和<uses-featureandroid:name="android.hardware.camera"android:required="false"/>等权限,具体见API

     1、要调用系统内的相机实现拍照功能,使用Intent,利用putExtra()传值,并重现一下onActivityResult()回调方法即可

      2、如果想要自己做相机,就得先检测手里里是否有相机

private boolean checkCameraHardware(Context context) {    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){        // this device has a camera        return true;    } else {        // no camera on this device        return false;    }}
    并且获得Camera实例,

public static Camera getCameraInstance(){    Camera c = null;    try {        c = Camera.open(); // open()里面如果不传值或者为0就是默认后置摄像头,若为1,那就可能是前置摄像头
//在方法中可以设置Camera的参数,例如相片大小之类的,利用flatten()方法可以获得手机里的全部参数
    }    catch (Exception e){        // Camera is not available (in use or does not exist)    }    return c; // returns null if camera is unavailable}
然后在创建一个视图类继承SurfaceView实现SurfaceHolder接口,重写一下构造方法,并在surfaceCreated();surfaceChanged();surfaceDestroyed()三个方法中重写自己想要做的事(注意可能由于安卓版本的不同,有些方法的取舍不一致,在安卓3.0后就不必注意了),往往会在第一个方法中传入SetPreviewDisplay(holder)然后在startPreview()方法。再者新建一个线性布局,利用帧布局来输出画面,当然按钮是必不可少的。接下来就要实现点击事件,在其中写入Camera.takePictrre()方法,在其中实现PictureCalllback接口,再将数组数据写到文件当中并保存呢,
File pictureFile = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg"); //文件存在SD卡的根目录                                                                                             // 下,名字以当前时间.jpg格式命名
 try {            FileOutputStream fos = new FileOutputStream(pictureFile);            fos.write(data);            fos.close();        } catch (FileNotFoundException e) {            Log.d(TAG, "File not found: " + e.getMessage());        } catch (IOException e) {            Log.d(TAG, "Error accessing file: " + e.getMessage());        }

 最后在onDestory()中利用relase()方法释放相机资源,置为null。

    到此为止,一个自己的相机就完成了,(一定要注意添加权限,否则运行不了,在activity里可以设置预览 方向android:screenOrientation="landscape")。


  Videos

     注意写摄像机时一定要先解锁再给摄像头上锁

  1、 同样,调用系统相机使用Intent调用,重写onActivityResult()方法即可。

  2、首先调用open()方法得到相机实例,然后在Activity内部写一个内部类(实现SurfaceHolder.callback接口)创建一个视图预览类或者重写一个Activity  类 也 来设置预览视图。布局文件利用SurfaceView控件显示视图。然后在添加的Button中添加点击事件,先解锁摄像机camera.unClock(),并设置MediaRecorder的各种参数,例如分辨率setProfile()等参数,然后利用setPreviewDisplay(surface)方法开启预览,在prepare(),最后start()就成功开启了一个摄像机。最后用完后必须给摄像机上锁Camera.clock(),并且释放资源relase(),置为空即可。


其实写一个自己的相机和摄像机代码都类似,都要写一个预览视图类继承SurfaceView类实现SurfaceHolder.callback接口,建议写Camera或者Video之前了解一下SurfaceView SurfaceHolder 和 SurfaceView ,对此很有帮助。。本文仅是作者看完官方API后的简谈,如有误,望读者指出,谢谢合作。


2 0
原创粉丝点击