`

Android开发:定制自己的Camera

 
阅读更多

在Android的hardware包中有一个Camera类。这个类就是获取Camera服务的,可以定制Camera等。

可以通过open()方法获取其实例。

在使用这个类是需要在AndroidManifest.xml文件中加入相应的权限和特性。

如:

<uses-permission android:name = "android.permission.CAMERA" /> 
<uses-feature android:name = "android.hardware.camera" /> 
<uses-feature android:name = "android.hardware.camera.autofocus" />  

 

本文实例:

 

package demo.camera; 

import java.io.OutputStream; 

import java.util.Iterator; 

import java.util.List; 

import android.app.Activity; 

import android.content.ContentValues; 

import android.content.res.Configuration; 

import android.hardware.Camera; 

import android.net.Uri; 

import android.os.Bundle; 

import android.provider.MediaStore; 

import android.view.SurfaceHolder; 

import android.view.SurfaceView; 

import android.view.View; 

import android.widget.LinearLayout; 

/** 

 * Android自带的Camera应用程序可以完成很多功能。但是当其不能满足我们需要的时候 

 * 我们可以定制自己的Camera。Android提供了Camera类来辅助我们实现自己的Camera。 

 * 这个例子就来定义一个自己的Camera 

 * 首先,在Manifest中需要引入权限<uses-permission android:name="android:permission.CAMERA"/> 

 * 我们需要用来存放取景器的容器,这个容器就是SurfaceView。 

 * 使用SurfaceView的同时,我们还需要使用到SurfaceHolder,SurfaceHolder相当于一个监听器,可以监听 

 * Surface上的变化,通过其内部类CallBack来实现。 

 * 为了可以获取图片,我们需要使用Camera的takePicture方法同时我们需要实现Camera.PictureCallBack类,实现onPictureTaken方法 

 * @author Administrator 

 * 

 */ 

public class MyCamera extends Activity implements SurfaceHolder.Callback,Camera.PictureCallback{ 

     

    public static final int MAX_WIDTH = 200; 

    public static final int MAX_HEIGHT = 200; 

     

    private SurfaceView surfaceView; 

     

    private Camera camera; //这个是hardare的Camera对象 

     

    public void onCreate(Bundle savedInstanceState){ 

        super.onCreate(savedInstanceState); 

        this.setContentView(R.layout.camera); 

        surfaceView = (SurfaceView)this.findViewById(R.id.myCameraView); 

        surfaceView.setFocusable(true);  

        surfaceView.setFocusableInTouchMode(true); 

        surfaceView.setClickable(true); 

        surfaceView.setOnClickListener(new View.OnClickListener() { 

             

            @Override 

            public void onClick(View v) { 

                 

                camera.takePicture(null, null, null, MyCamera.this); 

                 

            } 

        }); 

        //SurfaceView中的getHolder方法可以获取到一个SurfaceHolder实例 

        SurfaceHolder holder = surfaceView.getHolder(); 

        //为了实现照片预览功能,需要将SurfaceHolder的类型设置为PUSH 

        //这样,画图缓存就由Camera类来管理,画图缓存是独立于Surface的 

        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

        holder.addCallback(this); 

    } 

    @Override 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

    } 

    @Override 

    public void surfaceCreated(SurfaceHolder holder) { 

        // 当Surface被创建的时候,该方法被调用,可以在这里实例化Camera对象 

        //同时可以对Camera进行定制 

        camera = Camera.open(); //获取Camera实例 

     

         

        /** 

         * Camera对象中含有一个内部类Camera.Parameters.该类可以对Camera的特性进行定制 

         * 在Parameters中设置完成后,需要调用Camera.setParameters()方法,相应的设置才会生效 

         * 由于不同的设备,Camera的特性是不同的,所以在设置时,需要首先判断设备对应的特性,再加以设置 

         * 比如在调用setEffects之前最好先调用getSupportedColorEffects。如果设备不支持颜色特性,那么该方法将 

         * 返回一个null 

         */ 

        try { 

             

            Camera.Parameters param = camera.getParameters(); 

            if(this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE){ 

                //如果是竖屏 

                param.set("orientation", "portrait"); 

                //在2.2以上可以使用 

                //camera.setDisplayOrientation(90); 

            }else{ 

                param.set("orientation", "landscape"); 

                //在2.2以上可以使用 

                //camera.setDisplayOrientation(0);               

            } 

            //首先获取系统设备支持的所有颜色特效,有复合我们的,则设置;否则不设置 

            List<String> colorEffects = param.getSupportedColorEffects(); 

            Iterator<String> colorItor = colorEffects.iterator(); 

            while(colorItor.hasNext()){ 

                String currColor = colorItor.next(); 

                if(currColor.equals(Camera.Parameters.EFFECT_SOLARIZE)){ 

                    param.setColorEffect(Camera.Parameters.EFFECT_SOLARIZE); 

                    break; 

                } 

            } 

            //设置完成需要再次调用setParameter方法才能生效 

            camera.setParameters(param); 

             

            camera.setPreviewDisplay(holder); 

             

            /** 

             * 在显示了预览后,我们有时候希望限制预览的Size 

             * 我们并不是自己指定一个SIze而是指定一个Size,然后 

             * 获取系统支持的SIZE,然后选择一个比指定SIZE小且最接近所指定SIZE的一个 

             * Camera.Size对象就是该SIZE。 

             *  

             */ 

            int bestWidth = 0; 

            int bestHeight = 0; 

             

            List<Camera.Size> sizeList = param.getSupportedPreviewSizes(); 

            //如果sizeList只有一个我们也没有必要做什么了,因为就他一个别无选择 

            if(sizeList.size() > 1){ 

                Iterator<Camera.Size> itor = sizeList.iterator(); 

                while(itor.hasNext()){ 

                    Camera.Size cur = itor.next(); 

                    if(cur.width > bestWidth && cur.height>bestHeight && cur.width <MAX_WIDTH && cur.height < MAX_HEIGHT){ 

                        bestWidth = cur.width; 

                        bestHeight = cur.height; 

                    } 

                } 

                if(bestWidth != 0 && bestHeight != 0){ 

                    param.setPreviewSize(bestWidth, bestHeight); 

                    //这里改变了SIze后,我们还要告诉SurfaceView,否则,Surface将不会改变大小,进入Camera的图像将质量很差 

                    surfaceView.setLayoutParams(new LinearLayout.LayoutParams(bestWidth, bestHeight)); 

                } 

            } 

            camera.setParameters(param); 

        } catch (Exception e) { 

            // 如果出现异常,则释放Camera对象 

            camera.release(); 

        } 

         

        //启动预览功能 

        camera.startPreview(); 

         

    } 

    @Override 

    public void surfaceDestroyed(SurfaceHolder holder) { 

        // 当Surface被销毁的时候,该方法被调用 

        //在这里需要释放Camera资源 

        camera.stopPreview(); 

        camera.release(); 

         

    } 

    @Override 

    public void onPictureTaken(byte[] data, Camera camera) { 

        // data是一个原始的JPEG图像数据, 

        //在这里我们可以存储图片,很显然可以采用MediaStore 

        //注意保存图片后,再次调用startPreview()回到预览 

        Uri imageUri = this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues()); 

        try { 

            OutputStream os = this.getContentResolver().openOutputStream(imageUri); 

            os.write(data); 

            os.flush(); 

            os.close(); 

        } catch (Exception e) { 

            // TODO: handle exception 

            e.printStackTrace(); 

        } 

         

        camera.startPreview(); 

    } 

     

} 

 

来自:http://mobile.51cto.com/amedia-376703.htm

 

 

分享到:
评论

相关推荐

    Android开发:控制镜头变焦

    在Android平台上进行应用程序开发时,有时我们需要实现对设备摄像头的高级功能控制,比如调整镜头的变焦。在本文中,我们将深入探讨如何在Android应用中实现控制镜头变焦,特别是针对三星盖世系列相机(如GC-100和GC...

    android source code:Camera.zip

    "android source code: Camera.zip" 提供的是Android操作系统中与相机相关的源代码,这对于开发者深入理解Android相机的工作原理,以及进行自定义相机应用开发极其有价值。下面将详细解析其中涉及的重要知识点: 1....

    android 自定义相机,Camera和camera2.TextureView,相机遮罩层demo

    在Android开发中,自定义相机是一项常见的需求,它允许开发者根据特定的应用场景或者设计风格定制相机界面和功能。本文将详细讲解如何使用Camera API和Camera2 API结合TextureView来实现一个自定义相机,并添加相机...

    Android原生Camera2完成预览和拍照

    通过研究和运行此示例,开发者可以更深入地理解Camera2 API的用法,并为自己的应用程序定制相机功能。 总结,掌握Android原生Camera2 API不仅需要理解各种类和接口的用法,还需要熟悉Android的生命周期管理和多线程...

    android camera 拍照流程图

    1. **Camera API**(旧版):这是早期Android系统中提供的相机接口,简单易用,但功能相对有限,不支持高级定制和硬件级别的控制。 2. **Camera2 API**:自Android 5.0(Lollipop)开始引入,提供了更全面的相机...

    android自定义Camera实现

    在Android平台上,自定义Camera的实现是一个常见的需求,它允许开发者根据特定的用户界面和功能需求来定制相机应用。本文将深入探讨如何在Android中创建一个简单的自定义Camera。 首先,理解Android Camera API是...

    Android 自定义相机Camera2源码下载

    在Android平台上,自定义相机开发是一项常见的任务,Camera2 API是Google为了提供更高级、更灵活的相机控制而引入的接口。本教程将深入探讨如何使用Camera2 API创建一个自定义相机应用,通过分析提供的OneSelfCamera...

    camera _salmonrhx_camera_android_原生camera开发_

    在Android平台上,原生相机(Native Camera)开发是一项核心技能,尤其对于那些希望深度定制相机功能的开发者来说。"camera_salmonrhx_camera_android_原生camera开发_"这个项目显然是一个专注于Android原生相机API...

    Android v4l2 camera apk

    总之,Android v4l2 camera apk是一个强大的工具,为Android开发者提供了更底层的摄像头控制能力,无论是在硬件适配、驱动调试,还是在应用开发方面,都提供了巨大的便利。通过理解和掌握这款应用,开发者可以在...

    Android Camera2 API

    Camera2 API的出现,为开发者提供了更强大的控制力,能够实现更为专业和定制化的相机应用。 1. **Camera2 API的基本概念** Camera2 API是Android 5.0(Lollipop)引入的一个新接口,它提供了一个低级、灵活的框架...

    Android 原生Camera

    Android原生Camera是Android系统中用于处理相机功能的核心组件,主要负责捕捉图像和录制视频。...随着Android版本的迭代,Camera2 API逐渐成为主流,开发者应该熟悉其高级特性,以实现更高效、更定制化的相机应用。

    4.0android之camera

    总结,Android 4.0的Camera API改进显著提升了相机功能的可定制性和性能,为开发者提供了更多创造出色拍照和录像应用的可能性。理解和熟练运用这两个API对于Android应用开发尤其是摄影类应用至关重要。

    android Camera源码(可用)

    在Android平台上,Camera API是开发人员用来访问和控制设备摄像头的关键接口。这个“android Camera源码(可用)”提供了一套完整的源代码,已经解决了包名问题并经过测试,确保可以无故障运行,这对于开发者来说是...

    android4.0camera源码

    在Android 4.0(Ice Cream Sandwich)系统中,Camera模块是系统的重要组成部分,它为开发者提供了丰富的功能,包括拍照、录制视频、设置参数等。本文将深入探讨Android 4.0 Camera源码中的关键知识点。 一、Camera...

    android照相机源码camera

    通过深入研究Android 4.0的相机源码,开发者不仅可以定制自己的相机应用,还能了解Android系统的底层工作原理,提升对Android平台的理解。同时,这些知识也能帮助开发者解决实际开发中遇到的各类问题,提高应用的...

    Android自定义Camera

    在Android开发中,自定义Camera是一项常见的需求,它允许开发者根据特定的应用场景或者用户体验来定制相机功能。本文将深入探讨如何在Android中实现自定义Camera,主要包括以下几个关键知识点: 1. **Camera API**...

    Android调用系统相机和自定义相机实例圆形取景框。Camera工具类

    在Android开发中,调用系统相机以及自定义相机功能是常见的需求,特别是在涉及到图像拍摄和处理的应用中。本文将深入探讨如何实现这一功能,并重点介绍如何创建一个具有圆形取景框的自定义相机。 首先,调用系统...

    Android 自带应用相机(Camera)源代码

    在Android系统中,相机应用是用户与设备物理摄像头交互的核心组件。通过分析Android自带应用相机的源代码,我们可以深入理解其工作原理,从而...同时,理解源码也有助于解决实际开发中遇到的问题,提供定制化解决方案。

    Android应用程序开发

    - **Eclipse with ADT Plugin**:早期Android开发的主要工具,虽然已被Android Studio取代,但在某些特定情况下仍可能被使用。 ##### 2. 安装Java Development Kit (JDK) - Android开发基于Java语言,因此需要安装...

Global site tag (gtag.js) - Google Analytics