android 模拟器调用系统照相机
在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.
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7.
8. android:layout_width="fill_parent"
9. android:layout_height="fill_parent"/>
10.
11. android:layout_width="fill_parent"
12. android:layout_height="fill_parent"/>
13.
SurfaceView 用来预览图像,ImageView 用来显示所拍的照片。这里也需读者会问,为什么要使用SurfaceView 来预览图像?使用其他的View不可以吗?要回答这个问题,需要了解下SurfaceView 的作用,关于SurfaceView 的详细介绍已超出了本教程的范围,我们会在后续教程中来详细介绍SurfaceView ,这里只做简要介绍。
在通常情况下,OPhone程序中的View都是在同一个GUI线程中绘制的,该线程也是接收用户交互事件的线程(例如:按钮点击事件)。从另外的线程修改GUI元素是不可以的,如果要迅速的更新UI显示该如何办?显然在主线程中还需要处理其他事件,不适合做这件事情,所以OPhone提供了SurfaceView 来满足这种需求。一个SurfaceView 包装一个Surface对象(通过SurfaceHolder操作该对象)而不是Canvas对象,这就是关键所在,Surface可以在其他线程中绘制,这对于周期性更新和要求高帧率的场景来说是很有用的,特别是在游戏开发中。Surface中包含了当前UI的原生数据(raw data),在不同的软件和硬件条件下对这些数据的处理是不一样的,这就可以通过一些设置来加速图形的绘制,可以通过SurfaceHolder的setType函数来设置,目前接收如下的参数:
· 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
更多相关文章
- android 线程消息处理【之消息处理中再处理的个人学习小思考】
- Android的进程与线程(3)线程安全问题
- Android中线程和Handle
- 线程池与Android的日日夜夜
- Android(安卓)tools & sample data: Make preview great again
- 关于android中多线程相关遇到的问题总结
- Android(安卓)内存管理的相关知识
- 【译】利用多线程提高程序性能(for Android)
- EventBus 3.0进阶-Delivery Threads (ThreadMode)传送线程(线程模