android 模拟器调用系统照相机

来源:互联网 发布:梦幻西游mac不能更新 编辑:程序博客网 时间:2024/05/02 01:49

在android的模拟器上面调用系统的摄像机会出现异常的现象,会自动退出,这可能和模拟器有关,模拟器无法使用系统的硬件,就像重力感应和方向感应系统一样都无法使用,甚至是GPS

导航系统也无法使用,好像有个第三方的组织,已经模拟出来模拟器上使用重力感应。但是我没有真正的看到,下面的这几段是一本书上面写的android上面使用模拟器的例子。

这个示例将显示预览图像,在图像上点击则触发拍照操作,拍照成功后显示所拍的照片,然后点击Start菜单可以继续拍照。

首先通过OPhone开发工具(ODT)创建一个OPhone项目,填写基本信息后ODT会自动创建一个/src/org/goodev/camera/CameraActivity.java文件和res/layout/main.xml文件。

main.xml文件内容修改为如下:

view plaincopy to clipboardprint?

1.    <?xml version="1.0" encoding="utf-8"?>  

2.    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

3.        android:orientation="vertical"  

4.        android:layout_width="fill_parent"  

5.        android:layout_height="fill_parent"  

6.        >  

7.        <SurfaceView android:id="@+id/camera"  

8.            android:layout_width="fill_parent"  

9.            android:layout_height="fill_parent"/>  

10.     <ImageView android:id="@+id/image"  

11.         android:layout_width="fill_parent"  

12.         android:layout_height="fill_parent"/>  

13. </LinearLayout>  

<?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" > <SurfaceView android:id="@+id/camera" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <ImageView android:id="@+id/image" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </LinearLayout>

SurfaceView 用来预览图像,ImageView 用来显示所拍的照片。这里也需读者会问,为什么要使用SurfaceView 来预览图像?使用其他的View不可以吗?要回答这个问题,需要了解下SurfaceView 的作用,关于SurfaceView 的详细介绍已超出了本教程的范围,我们会在后续教程中来详细介绍SurfaceView ,这里只做简要介绍。

在通常情况下,OPhone程序中的View都是在同一个GUI线程中绘制的,该线程也是接收用户交互事件的线程(例如:按钮点击事件)。从另外的线程修改GUI元素是不可以的,如果要迅速的更新UI显示该如何办?显然在主线程中还需要处理其他事件,不适合做这件事情,所以OPhone提供了SurfaceView 来满足这种需求。一个SurfaceView 包装一个Surface对象(通过SurfaceHolder操作该对象)而不是Canvas对象,这就是关键所在,Surface可以在其他线程中绘制,这对于周期性更新和要求高帧率的场景来说是很有用的,特别是在游戏开发中。Surface中包含了当前UI的原生数据(raw data),在不同的软件和硬件条件下对这些数据的处理是不一样的,这就可以通过一些设置来加速图形的绘制,可以通过SurfaceHoldersetType函数来设置,目前接收如下的参数:

·         SURFACE_TYPE_NORMAL:用RAM缓存原生数据的普通Surface

·         SURFACE_TYPE_HARDWARE:适用于DMA(Direct memory access )引擎和硬件加速的Surface

·         SURFACE_TYPE_GPU:适用于GPU加速的Surface

·         SURFACE_TYPE_PUSH_BUFFERS:表明该Surface不包含原生数据,Surface用到的数据由其他对象提供,在Camera图像预览中就使用该类型的Surface,有Camera负责提供给预览Surface数据,这样图像预览会比较流畅。如果在这里设置了上面三种类型则可以发现不会出现预览图像,在和Camera底层的预览机制实现有关,如果对预览有特殊要求的可以现实PreviewCallback 接口来自己处理。

关于SurfaceView先简单介绍到这里,下面来继续看看如何在代码中实现。

修改CameraActivity类使其实现如下接口:

view plaincopy to clipboardprint?

1.    android.view.SurfaceHolder.Callback   

2.    android.view.View.OnClickListener  

原创粉丝点击