Android Camera(二)

标签: android camera | 发表时间:2012-09-11 08:15 | 作者:FireOfStar
出处:http://blog.csdn.net

构建一个Camera应用程序

某些开发可能想要在他们的应用中定制Camera的用户界面,或者要提供一些特殊的功能。创建定制化的Activity比使用Intent需要更多的代码,但它能够给你的户提供更好的体验。

以下是创建定制化的Camera界面的一般步骤:

1. 检查和访问Camera:创建代码来检查Camera和所申请访问的存在性;

2. 创建一个预览类:继承SurfaceView来创建一个Camera的预览类,并实现SurfaceHolder接口。这个类用来预览来之Camera的实施图像。

3. 构建一个预览布局:一旦有了Camera预览类,就可以把这个预览类和你想要的用户界面控制结合在一起来创建一个视图布局。

4. 针对采集建立监听:把监听器与响应用户动作(如按下按钮)的界面控制连接到一起来启动图像或视频的采集。

5. 采集和保存文件:针对真正采集的图片或视频,以及输出的保存来编写代码。

6. 释放Camera:使用Camera之后,你的应用程序必须释放Camera,以便其他应用程序能够使用。

Camera硬件是一个必须要认真管理的共享资源,因此你的应用程序在使用它时,不能跟其他应用程序发生冲突。下文将讨论如何检查Camera硬件、如何申请对Camera的访问,如何采集图片和视频,以及在应用使用完成后如何释放Camera。

警告:在应用程序使用完Camera时,要记住通过调用Camera.release()方法来释放Camera对象。如果你的应用程序没有正确的释放Camera,所有的后续的视图对Camera的访问,包括你自己的应用程序,都会失败,并可能到你的或其他的应用程序关闭。

检查Camera硬件

如果你的应用程序没有使用清单特别的声明要使用Camera,那么就应该在运行时检查Camera是否有效。使用PackageManager.hasSystemFeature()方法,来执行这个检查,如下例代码所示:

/** Check if this device has a camera */

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;

    }

}

Android设备能够有多个Camera,例如用于摄影的背面Camera和用于视频会话的前面Camera。Android2.3(API Level9)以后的版本允许你使用Camera.getNumberOfCameras()方法来检查设备上可用的Camera的数量。

访问Camera

如果你已经判断在应用程序所运行的设备上有Camera,你必须获取通过Camera实例才能申请访问它(除非使用Intent来访问Camera)。

使用Camera.open()方法来访问主Camera,并确保要捕获任何异常,如下例代码所示:

/** A safe way to get an instance of the Camera object. */

public static Camera getCameraInstance(){

    Camera c = null;

    try {

        c = Camera.open(); // attempt to get a Camera instance

    }

    catch (Exception e){

        // Camera is not available (in use or does not exist)

    }

    return c; // returns null if camera is unavailable

}

警告:在使用Camera.open()时,要始终检查异常。如果没有检查Camera是否被使用或是否存在,会导致你的应用程序被系统关闭。

在运行Android2.3(API Level9)以上的设备上,你能够使用Camera.open(int)方法来访问指定的Camera。上面的示例代码访问的是第一个Camera,也就是多个Camera的设备上背面的那个Camera。

检查Camera功能

一旦获得了访问Camera的权限,就可以使用Camera.getParameters()方法来获取更多的有关Camera能力的信息,这个方法返回一个Camera.Parameters对象。在使用API Level9以上的版本时,使用Camera.getCameraInfo()方法来判断Camera是在设备的前面还是后面,以及图像的方向。

创建一个预览类

对用户有效的拍照或录像,必须是在设备的Camera上能够看到。Camera预览类是一个SurfaceView类,它能够实时的显示来自Camera的图像数据,因此用户能够取景和采集图片或视频。

下例的示例代码演示了如何创建能够被包含到View布局中的基本的Camera预览类。为了捕获创建和销毁View的回调事件,这个类实现了SurfaceHolder.Callback接口,用于跟Camera的预览输入相匹配:

/** A basic Camera preview class */
publicclassCameraPreviewextendsSurfaceViewimplementsSurfaceHolder.Callback{
    privateSurfaceHolder mHolder;
    privateCamera mCamera;
 
    publicCameraPreview(Context context,Camera camera){
        super(context);
        mCamera = camera;
 
        // Install a SurfaceHolder.Callback so we get notified when the
        // underlying surface is created and destroyed.
        mHolder = getHolder();
        mHolder.addCallback(this);
        // deprecated setting, but required on Android versions prior to 3.0
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }
 
    publicvoid surfaceCreated(SurfaceHolder holder){
        // The Surface has been created, now tell the camera where to draw the preview.
        try{
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        }catch(IOException e){
            Log.d(TAG,"Error setting camera preview: "+ e.getMessage());
        }
    }
 
    publicvoid surfaceDestroyed(SurfaceHolder holder){
        // empty. Take care of releasing the Camera preview in your activity.
    }
 
    publicvoid surfaceChanged(SurfaceHolder holder,int format,int w,int h){
        // If your preview can change or rotate, take care of those events here.
        // Make sure to stop the preview before resizing or reformatting it.
 
        if(mHolder.getSurface()==null){
          // preview surface does not exist
          return;
        }
 
        // stop preview before making changes
        try{
            mCamera.stopPreview();
        }catch(Exception e){
          // ignore: tried to stop a non-existent preview
        }
 
        // set preview size and make any resize, rotate or
        // reformatting changes here
 
        // start preview with new settings
        try{
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
 
        }catch(Exception e){
            Log.d(TAG,"Error starting camera preview: "+ e.getMessage());
        }
    }

}

如果你要给你Camera预览窗口设置一个特定的尺寸,可以像上面注释中标注的那样,设置surfaceChanged()方法。在设置预览尺寸的时候,必须使用来自getSupportedPreviewSizes()方法的值,在setPreviewSize()方法中不能使用随意的值。

作者:FireOfStar 发表于2012-9-11 8:15:38 原文链接
阅读:0 评论:0 查看评论

相关 [android camera] 推荐:

Android Camera(二)

- - CSDN博客推荐文章
构建一个Camera应用程序. 某些开发可能想要在他们的应用中定制Camera的用户界面,或者要提供一些特殊的功能. 创建定制化的Activity比使用Intent需要更多的代码,但它能够给你的户提供更好的体验. 以下是创建定制化的Camera界面的一般步骤:. 1. 检查和访问Camera:创建代码来检查Camera和所申请访问的存在性;.

html5选择摄像头 android - Enable rear camera with HTML5 - Stack Overflow

- -

手抛球相机:Ball Camera

- 阳阳 - 爱…稀奇~{新鲜:科技:创意:有趣}
来自柏林工业大学(Technische Universität in Berlin)一帮死宅研究员的创意,手抛球相机(Ball Camera)在一颗球上集成了若干镜头,每次,将之抛起就能拍下一张360度的全景照片(如题图右所示),视觉效果相当别致,有种非常迷幻的俯视视角,就像是上帝不小心吸食了过量大麻,然后醉眼乜斜地俯瞰众生~.

Opera 12发布,开始支持camera api

- - 前端观察
opera前几天发布了新版的Opera 12,带来了一些比较酷的新特性,CSS3动画方面跟上了队伍,实在是一件令人鼓舞的事情. 现在让我们来具体看一下都有哪些更新:. 支持 WebRTC标准——最赞的就是开始支持CameraAPI,现在可以通过windows.getUserMedia接口来通过浏览器使用用户的摄像头了.

i-Camera Case 超逼真立体相机iPhone壳

- 电饭锅 - 设计|生活|发现新鲜
超有趣仿真相机iPhone4外壳到货啦,超精致细节,迄今最逼真的立体效果,绝对萌翻天. 高仿真设计,镜头部可以调节,拉出后可以作为支架斜立于桌面. 黑白、白色、粉色、绿色四色可选,点此购买. 颜色:黑色,白色,粉色,绿色. 规格:W12.3cm x D3cm x H6.7cm. 「设计,生活,发现新鲜」在新浪微博,更即时地获读更新,更直接地交流沟通.

二次曝光迷你照相机:Lo-fi Camera

- youschan - 爱…稀奇~{新鲜:科技:创意:有趣}
来自Photojojo公司的一款创意Lomo相机,二次曝光迷你照相机(Lo-fi Camera),简单地说,它以超级袖珍的提供提供了内置的二次曝光模式,能拍摄出一些很有感觉的创意照片. 320万像素,快门速度从1/8支持到1/5000,焦距从0.9米到无穷远,但是ISO被固定在了100,能拍摄2048X1536分辨率的静止照片和640X480分辨率的视频,这些素材都可以通过自带的1英寸大小的液晶屏进行回放,并能储存在SD卡中,然后通过USB口充电和传输文件.

不用对焦!Lytro光场相机:Lytro Camera

- youschan - 爱…稀奇~{新鲜:科技:创意:有趣}
这是相机厂商Lytro带来的一款全新概念的相机,爱稀奇给它取了个诨名叫做“摄影棒”——是的,借助它,你真的能拍出很棒的照片来:. 据百度百科的介绍,光场相机由美国斯坦福大学电脑科学系华裔博士生吴义仁等人发明,一般相机以主镜头捕捉光线,再聚焦在镜头后的胶片或感光器上,所有光线的总和形成相片上的小点,显示影像.

LOMO控无法抗拒的甜蜜~相机翻糖饼干:Camera Cookie

- 骁炜 - 爱…稀奇~{新鲜:科技:创意:有趣}
这是饼干网站Manjar推出的相机翻糖饼干:他们用漂亮的糖霜塑造出了经典LOMO相机的造型,有颇具传奇色彩的Diana、简单好用的拍立得,还有爱稀奇有售的Black Bird Fly TLR,糖霜特有的鲜艳色彩展现出了夸张时尚的LOMO风格,LOMO控们一定会爱不释手~. 一盒9块饼干,三个款式,售价35美元,这里可以买到:etsy.com,不过MS目前仅向美国和墨西哥供货,看来大家暂时只能饱眼福、饱不了口福了:(.

创业神话:相机应用Camera+ 600万下载 营收510万美元

- - 互联网的那点事...
iPhone 相机移动应用  Camera+ 突破600万下载量,实现营收 510万美元,截止本月14号已经获得5,125,844(512.5万)美元收入. 诚然,部分原因归结于 苹果在2011年发布 iPhone 4s智能手机,让Camera+ 有了英雄用武之处. 我们通过该公司的博客, via,来看看创业神话相机应用或者拍照应用Camera+,苹果应用商店下载地址: 点击进入.

苹果 iPhone 上最好的相机增强和照片编辑应用软件:Camera+(收费 App)

- jimmy54 - 苹果fans-中文 Apple Blog
    苹果 iPhone 自带的相机应用具备基本的拍照和照片编辑功能,如果你想要更专业的拍照和照片后期处理功能,就得借助第三方 App 了. 下面就推荐一个苹果 iPhone 上最有名的也是我用过的最好的拍照辅助和照片处理应用软件:Camera+.     看完本篇介绍,对比以前写的苹果 iOS 5 系统试用,你也会知道砖家们嚷嚷的 “iOS 5 自带拍照功能抢了 Camera+ 饭碗”有多扯蛋.