`
mjbb
  • 浏览: 90270 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

android 手机拍照流程

阅读更多

 

android 拍照API流程

 

1. 在布局文件中添加一个 surfaceView (摄影平面)

2.根据 SurfaceView  获得 Holder (固定器)

3.给固定器设置 SurfaceHolder.Callback ; 这个 Callback 有一系列的周期方法,

比如:surfaceCreated,surfaceChanged,surfaceDestroyed等方法.

①.在surfaceDestroyed 中 打开相机,设置预览效果 ;

②.在surfaceChanged中可以初始化相机( Camera );比如相机的参数: 像素, 大小,格式,开始预览,等等

③.在surfaceDestroyed可以可以停止相机拍摄;释放相机资源

4. 相机自动对焦 的回调处理

Camera.autoFocus( AutoFocusCallback )

	AutoFocusCallback 有个接口方法
	 public void onAutoFocus(boolean focused, Camera camera) {
                    /* 对到焦点拍照 */
                    if (focused) {
                            takePicture();//见第5步
                    }
            }
 

5.Camera.takePicture(ShutterCallback shutter/*摄像*/, PictureCallback raw/*拍照*/, PictureCallback jpeg/*照片*/)

查看API或者源码,可以发现,这些callback里面都有包含摄像,或者被拍照时的byte[]数据,而这些数据可以根据BitmapFactory变成Bitmap图片.

 

见源代码如下:

 

public class ScanBarZBarActivity extends Activity implements SurfaceHolder.Callback{
	private static String TAG = "ScanBarZBarActivity";
	 private Camera mCamera;
    private Button mButton, mButton1, mButton2;
    private SurfaceView mSurfaceView;
    private SurfaceHolder holder;
    private AutoFocusCallback mAutoFocusCallback = new AutoFocusCallback();
    private String path = "WXJSMyPhoto";
    private String path1;
    private Bitmap bmp;
    private int cnt = 1;
    private Calendar c;
    public native String getISBN(Bitmap bmp);
    private int flag=5;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            /* 隐藏状态栏 */
            this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                            WindowManager.LayoutParams.FLAG_FULLSCREEN);
            /* 隐藏标题栏 */
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            /* 设定屏幕显示为横向 */
            this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

            setContentView(R.layout.camera);
            /* SurfaceHolder设定 */
            mSurfaceView = (SurfaceView) findViewById(R.id.mSurfaceView);
            holder = mSurfaceView.getHolder();
            holder.addCallback(ScanBarZBarActivity.this);
            holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
            c = Calendar.getInstance();

            /* Button初始化 */
            mButton = (Button) findViewById(R.id.myButton);
            mButton1 = (Button) findViewById(R.id.myButton1);
            mButton2 = (Button) findViewById(R.id.myButton2);
            /* 拍照Button的事件处理 */
            mButton.setOnClickListener(new Button.OnClickListener() {
                    @Override
                    public void onClick(View arg0) {
                            /* 告动对焦后拍照 */
                            mCamera.autoFocus(mAutoFocusCallback);
                    }
            });
            /* Button的事件处理 */
            mButton1.setOnClickListener(new Button.OnClickListener() {
                    @Override
                    public void onClick(View arg0) {
                            /* 保存文件 */
                   	 Log.i(TAG,"click button2");
                            if (bmp != null) {
                                    /* 检查SDCard是否存在 */
                                    if (!Environment.MEDIA_MOUNTED.equals(Environment
                                                    .getExternalStorageState())) {
                                            /* SD卡不存在,显示Toast信息 */
                                            Toast.makeText(ScanBarZBarActivity.this,
                                                            "SD卡不存在!无法保存相片,请插入SD卡。", Toast.LENGTH_LONG)
                                                            .show();
                                    } else {
                                            try {
                                                    /* 文件不存在就创建 */
                                                    File f = new File(Environment
                                                                    .getExternalStorageDirectory(), path);
                                                    Log.i(TAG,"click button2:" + f.getAbsolutePath());
                                                    if (!f.exists()) {
                                                            f.mkdir();
                                                    }
                                                    /* 保存相片文件 */
                                                    path1 = String.valueOf(c.get(Calendar.MILLISECOND))
                                                                    + "camera.jpg";
                                                    File n = new File(f, path1);
                                                    FileOutputStream bos = new FileOutputStream(n
                                                                    .getAbsolutePath());
                                                    /* 文件转换 */
                                                    bmp.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                                                    /* 调用flush()方法,更新BufferStream */
                                                    bos.flush();
                                                    /* 结束OutputStream */
                                                    bos.close();
                                                    Toast.makeText(ScanBarZBarActivity.this,
                                                                    path1 + "保存成功!", Toast.LENGTH_LONG).show();
                                                    cnt++;
                                            } catch (Exception e) {
                                                    e.printStackTrace();
                                            }
                                    }
                            }

                            mButton.setVisibility(View.VISIBLE);
                            mButton1.setVisibility(View.VISIBLE);
                            mButton2.setVisibility(View.VISIBLE);
                            /* 重新设定Camera */
                            stopCamera();
                            initCamera();
                    }
            });
            /* 放弃Button的事件处理 */
            mButton2.setOnClickListener(new Button.OnClickListener() {
                    @Override
                    public void onClick(View arg0) {
                            mButton.setVisibility(View.VISIBLE);
                            mButton1.setVisibility(View.VISIBLE);
                            mButton2.setVisibility(View.VISIBLE);
                            /* 重新设定Camera */
                            stopCamera();
                            initCamera();
                    }
            });
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceholder) {
            try {
                    /* 打开相机, */
                    mCamera = Camera.open();
                    mCamera.setPreviewDisplay(holder);
            } catch (IOException exception) {
                    mCamera.release();
                    mCamera = null;
            }
    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceholder, int format, int w,
                    int h) {
            /* 相机初始化 */
    		Log.i(TAG,"init camera");
            initCamera();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceholder) {
    		Log.i(TAG,"destoryed camera");
            stopCamera();
            mCamera.release();
            mCamera = null;
    }

    /* 拍照的method */
    private void takePicture() {
            if (mCamera != null) {
            	Log.i(TAG,"takePicture");
                    mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
            }
    }

    private ShutterCallback shutterCallback = new ShutterCallback() {
            public void onShutter() {

            }
    };

    private PictureCallback rawCallback = new PictureCallback() {
            public void onPictureTaken(byte[] _data, Camera _camera) {
            }
    };

    private PictureCallback jpegCallback = new PictureCallback() {
            public void onPictureTaken(byte[] _data, Camera _camera) {
                    /* 取得相仞 */
                    try {
                            /* 设定Button?视性 */
                            mButton.setVisibility(View.GONE);
                            mButton1.setVisibility(View.VISIBLE);
                            mButton2.setVisibility(View.VISIBLE);
                            /* 取得相仞Bitmap对象 */
                            bmp = BitmapFactory.decodeByteArray(_data, 0, _data.length);
                            //发送给isbn分析
                           // String isbn = getISBN(bmp);获得图片解析后的信息
                          //  Log.i(TAG, "isbn:" + flag + isbn);
                            flag--;
                            if(flag>0){
                            	mCamera.autoFocus(mAutoFocusCallback);
                            }
                           
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    };

    /* 告定义class AutoFocusCallback */
    public final class AutoFocusCallback implements
                    android.hardware.Camera.AutoFocusCallback {
            public void onAutoFocus(boolean focused, Camera camera) {
                    /* 对到焦点拍照 */
                    if (focused) {
                            takePicture();
                    }
            }
    };

    /* 相机初始化的method */
    private void initCamera() {
            if (mCamera != null) {
                    try {
                            Camera.Parameters parameters = mCamera.getParameters();
                            /*
                             * 设定相片大小为1024*768, 格式为JPG
                             */
                            parameters.setPictureFormat(PixelFormat.JPEG);
                            parameters.setPictureSize(1024, 768);
                            mCamera.setParameters(parameters);
                            /* 开启预览画面 */
                            mCamera.startPreview();
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    }

    /* 停止相机的method */
    private void stopCamera() {
            if (mCamera != null) {
                    try {
                            /* 停止预览 */
                            mCamera.stopPreview();
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    }
}
 

 

分享到:
评论
1 楼 enefry 2011-05-24  
不能修改对焦和曝光时间啊.

相关推荐

    计算机视觉_车牌识别_Android_Demo_1741593747.zip

    Android平台的选择,一方面是因为其开源的特性和庞大的用户基础,另一方面也是因为智能手机的普及使得在移动设备上实现车牌识别成为可能。 Demo程序中可能包含的模块有图像采集、预处理、车牌定位、字符分割、字符...

    某集团信息化建设方案.docx

    其目标是在手机、个人数字助理(PDA)等移动终端上,通过电信、互联网通讯技术的融合,实现实时的信息交流和工作协同。 - **定义**: 移动信息化涉及将政府和企业的各种信息化软件体系(如办公自动化、ERP、CRM、物流...

    独子棋demo.rar

    独子棋demo.rar

    云安全联盟软件定义边界SDP标准规范2.0202239页.pdf

    云安全联盟软件定义边界SDP标准规范2.0202239页.pdf

    Uniapp开发的微商个人相册多端小程序源码

    Uniapp开发的微商个人相册多端小程序源码。使用 HBuilder X 导入本地项目,修改小程序AppID,以及Uni-app应用标识,调试发布即可。 小程序源码特点: 1、首页进行相册展示,采用分页 2、列表页面以文字形式进行分类,管理员可进行添加,修改和排序 3、每个列表下有多个相册,管理员可进行添加,修改和排序 4、每个相册有多张图片,有小图和大图模式进行切换 5、相册中可以长按图片进行选择删除和设为封面 6、相册可以进行分享 7、我的页面有管理员登录,联系客服等功能

    【FPGA硬件设计】基于FPGA的144通道可切换电压源系统设计:硬件架构与上位机软件实现(论文复现或解答,含详细代码及解释)

    内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。

    上市公司-人工智能-词频总和明细.xlsx

    地级市政府通过制定相关政策来推动数字经济的发展和数字政府的建设。这些政策可能包括鼓励企业数字化转型、促进数字技术创新、加强数字基础设施建设、优化数字政务服务等方面的内容。政策制定的频率和力度,可以在一定程度上反映政府对数字领域的关注度。 在地级市政府数字关注度的背景下,词频分析成为了一种有效的工具,用以衡量政府文件和宣传资料中涉及数字技术和数字化转型相关词汇的频次,进而揭示政府对这一领域的关注程度和重视方向。 数据名称:地级市-政府数字关注度、词频

    Android平台上基于多尺度多角度模板匹配的图像识别技术及其在不同ARM架构的应用

    内容概要:本文详细探讨了在Android平台上进行图像模板匹配的技术挑战和解决方案,特别是在处理不同尺寸和旋转角度的目标物时的方法。文中介绍了使用OpenCV构建图像金字塔、处理旋转模板以及利用NEON指令集优化性能的具体实现。此外,文章还讨论了在armeabi-v7a和arm64-v8a这两种主要ARM架构下的优化技巧,如内存对齐、SIMD指令优化、RenderScript并行处理等。作者分享了许多实践经验,包括如何避免常见的性能瓶颈和兼容性问题。 适合人群:有一定Android开发经验,尤其是熟悉OpenCV和NDK编程的中级及以上开发者。 使用场景及目标:适用于需要在移动设备上进行高效图像识别的应用开发,如实时视频流中的物体检测、游戏内的道具识别等。目标是提高模板匹配的速度和准确性,同时确保在不同硬件配置下的稳定性和兼容性。 其他说明:文章提供了丰富的代码片段和实际案例,帮助读者更好地理解和应用所介绍的技术。特别强调了在不同ARM架构下的优化策略,为开发者提供了宝贵的参考资料。

    电力系统中基于改进粒子群算法的微电网多目标优化调度研究

    内容概要:本文探讨了一种改进的粒子群优化(PSO)算法在微电网多目标优化调度中的应用。传统PSO在解决此类复杂问题时常陷入局部最优解,而改进版通过引入动态惯性因子和自适应变异操作,显著提升了算法性能。文中详细介绍了这两种改进措施的具体实现方法及其对算法收敛性和解质量的影响。此外,还展示了该算法在实际微电网调度任务中的表现,特别是在权衡经济成本与环境效益方面的能力。 适合人群:从事电力系统优化、智能电网研究的专业人士以及对进化算法感兴趣的学者和技术人员。 使用场景及目标:适用于需要进行高效能源管理的场合,如分布式发电系统的规划与运行。主要目的是寻找既能降低成本又能减少环境污染的最佳调度方案。 其他说明:文中提供了大量伪代码片段帮助读者理解具体的技术细节,并强调了参数调节对于最终结果的重要性。同时指出,该方法不仅限于微电网领域,还可以扩展应用于其他类型的优化问题。

    Delphi 12.3控件之TeeChart Offline Keygen.7z

    Delphi 12.3控件之TeeChart Offline Keygen.7z

    MATLAB在光学领域屈光度计算中的数据处理与应用

    内容概要:本文详细介绍了如何利用MATLAB进行屈光度计算及其数据处理方法。首先解释了屈光度的基本概念和计算公式,接着展示了如何通过MATLAB代码读取、清理和转换焦距数据为屈光度,并进行了必要的单位转换。针对可能出现的异常值和噪声,文中提供了有效的数据清洗手段。此外,还探讨了如何对屈光度数据进行统计分析以及可视化呈现,如绘制趋势图和散点图等。最后,提到了将MATLAB代码转化为C++代码以便集成到硬件系统的高级应用。 适合人群:从事光学研究、眼科医疗设备开发的技术人员,以及对MATLAB有兴趣的学习者。 使用场景及目标:适用于需要精确处理和分析光学数据的研究机构或企业,旨在提高屈光度计算的效率和准确性,确保数据质量的同时优化实验结果。 其他说明:文中不仅涵盖了基本的操作步骤,还包括了许多实用的小贴士和技术细节,有助于读者更好地理解和掌握相关内容。同时强调了单位一致性的重要性,提醒开发者注意潜在的问题。

    349421c2-4955-4132-b4da-808a3a171bfe.pdf

    349421c2-4955-4132-b4da-808a3a171bfe.pdf

    1744300906657718_download.jsp

    1744300906657718_download.jsp

    【简历全景认知5】简历通关指南:揭秘企业筛选简历的三重门系统

    【内容概要】 本文详细解析了企业筛选简历的“三重门”系统,包括ATS系统初筛、HR复核和业务部门终极评估三个阶段。首先,ATS系统作为关键词匹配引擎,强调了关键词的重要性及其优化方法;其次,HR在6秒内通过“薄片判断”评估简历的职业连贯性、成就量化和岗位匹配度;最后,业务部门则侧重于技术能力和文化适配性的综合评估。文章还揭示了各环节中的心理学原理和认知偏差,并提供了针对性的优化建议。 【适合人群】 正在求职或有求职打算的职场人士,尤其是希望提升简历通过率的求职者。 【使用场景及目标】 ①帮助求职者理解企业筛选简历的具体流程; ②提供简历优化的具体方法,如关键词优化、成就量化、案例准备等; ③指导求职者如何根据不同阶段的评审特点调整简历内容。 【其他说明】 文章结合了最新的招聘趋势研究报告和心理学理论,强调简历不仅是通过筛选的工具,更是展示个人能力和价值的平台。求职者应充分利用这些心理规律,打造更具吸引力的简历,为后续面试做好铺垫。

    PFC2D5.0二维岩石单轴压缩模拟:颗粒流代码解析与能量裂隙分析

    内容概要:本文详细介绍了使用PFC2D5.0进行二维岩石单轴压缩模拟的具体方法和代码实现。首先,通过设定模型的基本参数如颗粒生成、粘结设置、加载控制等,构建了一个完整的岩石样品模型。接着,深入探讨了加载过程中应力应变曲线的变化规律以及能量分析的方法,包括弹性应变能、动能和耗散能的监测。此外,还提供了裂隙统计的技术手段,能够精确捕捉岩石内部裂隙的发展情况。最后,强调了参数调整对模拟效果的影响,并给出了优化建议。 适合人群:从事岩土工程、地质力学研究的专业人士和技术爱好者。 使用场景及目标:适用于需要深入了解岩石力学特性的研究人员,帮助他们掌握PFC2D软件的应用技巧,提升科研能力。同时,也为相关领域的学生提供了一套实用的学习资料。 其他说明:文中提供的代码可以直接应用于PFC2D5.0环境,便于用户快速上手并进行实验验证。通过对不同参数的调整,可以模拟多种类型的岩石破坏行为,为实际工程项目提供理论支持。

    Fluent激光焊接数值模拟:基于UDF的锥形高斯热源建模与优化

    内容概要:本文详细介绍了如何使用Fluent进行激光焊接的数值模拟,重点讲解了锥形高斯热源的建模方法。文章首先解释了锥形高斯热源的特点及其与普通高斯热源的区别,然后给出了具体的UDF代码实现,包括热源强度的计算、热流衰减的控制以及热源移动的实现。此外,还讨论了网格划分、材料参数设置、常见错误排查和优化技巧等方面的内容。通过实例和操作视频,帮助读者快速掌握激光焊接数值模拟的方法和技术要点。 适合人群:具有一定CFD基础并希望深入学习激光焊接数值模拟的研究人员和工程师。 使用场景及目标:适用于需要精确模拟激光焊接过程的研究项目或工业应用,旨在提高模拟精度,减少试验成本,优化焊接工艺参数。 其他说明:文中提供了大量实用的操作技巧和注意事项,如网格划分建议、材料参数选择、UDF代码调试等,有助于解决实际操作中可能遇到的问题。同时,附带的操作视频和GitHub上的完整案例包也为初学者提供了宝贵的学习资源。

    序列化.md

    序列化.md

    ResumePlatformFront 笔试面试全攻略与资源宝典

    "ResumePlatformFront 笔试面试全攻略与资源宝典"——一站式前端求职解决方案!精选高频笔试真题解析、大厂面试经验分享、实战项目模板及技能进阶指南,助你系统攻克前端求职难关。从简历优化到Offer谈判,覆盖求职全流程,配套免费资源库持续更新。无论应届生还是进阶开发者,这里都是你斩获心仪Offer的强力后盾!

    weixin205微信小程序线上教育商城ssm(文档+源码)_kaic

    weixin205微信小程序线上教育商城ssm(文档+源码)_kaic

Global site tag (gtag.js) - Google Analytics