【android学习之十五】——多媒体2:相机Camera
来源:互联网 发布:js获取当前位置经纬度 编辑:程序博客网 时间:2024/05/19 03:23
手机的相机功能是当前大家玩拍照的一个必备功能,本篇的学习,我认为网上的一篇博文的讲解更容易理解一下,这里就转一下博文,自己把自己遇到的的问题给补充进来。引用的博文地址:http://xblia.iteye.com/blog/1167964
目前的智能手机拥有很多强大的功能,例如摄像头、GPS和无线上网等,现在是我们开始充分使用这些功能的时候了,在本篇文章中我们一起学习,如何在谷歌Android编程环境中,以最简单的方式实现谷歌Android摄像头拍照。
在本文示例中,我们需要用到两个文件:布局文件和Activity文件。
【提示】:在Android 1.5(代号cupcake)发布之后,在安全方面有诸多改进,其中之一与摄像头权限控制有关。在此之前,你能够创建无需用户许可就可实现拍照的应用。现在该问题已被修复,如果你想在自己的应用中使用摄像头,需要在AndroidManifest.xml中增加以下代码:
<uses-permission android:name="android.permission.CAMERA"/>
没有此授权代码,程序会报:Fail to connect to camera service 错误。
1. 设定摄像头布局
这是开发工作的基础,也就是说我们希望在应用程序中增加多少辅助性元素,如摄像头各种功能按钮等。在本文中我们采取最简方式,除了拍照外,没有多余摄像头功能。下面我们一起看一下本文示例将要用到的布局文件“main.xml”。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/surface_camera" android:layout_width="fill_parent" android:layout_height="10dip" android:layout_weight="1" > </SurfaceView></LinearLayout>
该布局非常简单,只有一个LinearLayout视图组,在它下面只有一个SurfaceView视图,也就是我们的摄像头屏幕。
【提示】:记住不要在资源文件名称中使用大写字母,如果你把该文件命名为“CameraSurface.xml”,会给你带来不必要的麻烦。
2. 摄像头实现CameraActivity代码
package com.jercy.android.Camera;import java.io.IOException;import android.app.Activity;import android.graphics.PixelFormat;import android.hardware.Camera;import android.os.Bundle;import android.util.Log;import android.view.SurfaceHolder;import android.view.SurfaceView;import android.view.Window;import android.view.WindowManager;public class CameraActivity extends Activity implements SurfaceHolder.Callback {private static final String TAG="CameraActivity";private Camera mCamera;private SurfaceView mSurfaceView;private SurfaceHolder mSurfaceHolder;private boolean mPreviewRunning = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFormat(PixelFormat.TRANSLUCENT); //屏幕格式为“半透明”。 requestWindowFeature(Window.FEATURE_NO_TITLE); //摄像头预览界面将通过全屏显示,没有“标题(title)” getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main); //设定Activity的布局为前面我们创建的main布局 mSurfaceView = (SurfaceView) findViewById(R.id.surface_camera); mSurfaceHolder = mSurfaceView.getHolder(); //surfaceview中获得了holder mSurfaceHolder.addCallback(this); //并增加callback功能到“this”。这意味着我们的操作(activity)将可以管理这个surfaceview。 mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Overridepublic void surfaceCreated(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i(TAG, "调用了CameraActivity的surfaceCreated方法");//mCamera是“Camera”类的一个对象。在surfaceCreated方法中我们“打开”摄像头。这就是启动它的方式 mCamera = Camera.open(); }@Override/** * 该方法让摄像头做好拍照准备,设定它的参数,并开始在Android屏幕中启动预览画面。 * 当mPreviewRunning为true时,意味着摄像头处于激活状态,并未被关闭,因此我们可以使用它。 */public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {// TODO Auto-generated method stubLog.i(TAG, "调用了CameraActivity的surfaceChanged方法");if(mPreviewRunning) { mCamera.stopPreview(); } Camera.Parameters p = mCamera.getParameters(); p.setPreviewSize(width, height); mCamera.setParameters(p); try { mCamera.setPreviewDisplay(holder); } catch (IOException e) { e.printStackTrace(); } mCamera.startPreview(); mPreviewRunning = true;}@Override/** * 通过这个方法,我们停止摄像头,并释放相关的资源。正如大家所看到的,我们在这儿设置mPreviewRunning为false, * 以此来防止在surfaceChanged方法中的冲突。因为这意味着我们已经关闭了摄像头,而且我们不能再设置其参数或在摄像头中启动图像预览 */public void surfaceDestroyed(SurfaceHolder holder) {// TODO Auto-generated method stubLog.i(TAG, "调用了CameraActivity的surfaceDestroyed方法");mCamera.stopPreview(); mPreviewRunning = false; mCamera.release(); }/** * 当拍照时,该方法被调用。举例来说,你可以在界面上创建一个OnClickListener,当你点击屏幕时, * 调用PictureCallBack方法。 这个方法会向你提供图像的字节数组, * 然后你可以使用Android提供的Bitmap和BitmapFactory类,将其从字节数组转换成你想要的图像格式。 */Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { public void onPictureTaken(byte[] imageData, Camera c) { } }; }
分析Activity类,实现SurfaceHolder.Callback接口:
接口SurfaceHolder.Callback被用来接收摄像头预览界面变化的信息。它实现了三个方法:
surfaceChanged
当预览界面的格式和大小发生改变时,该方法被调用。
surfaceCreated
初次实例化,预览界面被创建时,该方法被调用。
surfaceDestroyed
当预览界面被关闭时,该方法被调用。
如下图为运行程序,并且点击取消按钮退出程序过程的Log日志:
11-14 08:24:10.420: I/CameraActivity(426): 调用了CameraActivity的surfaceCreated方法11-14 08:24:20.374: I/CameraActivity(426): 调用了CameraActivity的surfaceChanged方法11-14 08:24:32.899: W/KeyCharacterMap(426): No keyboard for id 011-14 08:24:32.899: W/KeyCharacterMap(426): Using default keymap: /system/usr/keychars/qwerty.kcm.bin11-14 08:24:35.746: I/CameraActivity(426): 调用了CameraActivity的surfaceDestroyed方法
效果图:
- 【android学习之十五】——多媒体2:相机Camera
- Android多媒体之相机Camera
- Android多媒体—拍照Camera
- Android多媒体学习十五:使用在内置的Camera录制视频
- Android多媒体学习十五:使用在内置的Camera录制视频
- 《android多媒体api》之camera配合surface预览相机画面和拍照
- android开发之Camera(相机)
- Android 多媒体——音频播放录制、视频播放、相机
- Android 多媒体应用——调用系统相机和相册
- android多媒体——5步学会使用系统相机
- android开发——自定义相机(Camera)开发总结
- 【android学习之十四】——多媒体1:音乐播放
- Android Camera 相机常见问题
- Android相机Camera
- 自定义相机Camera-android
- Android相机Camera基础
- Android 相机使用 Camera
- android camera相机demo
- 重温经典之赫夫曼(Huffman)编码
- verison control
- PLSQL导入导出数据库
- 线程----BlockingQueue (转)
- 国外博士论文下载
- 【android学习之十五】——多媒体2:相机Camera
- 学后感,一点小心情。
- Android Animation
- delphi:临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别
- wcf 宿主不通的优异(NETTCP协议)
- SQL Server2005使用CTE实现递归
- web项目web.xml的配置中<context-param>配置是起什么作用的
- 光棍节成交3369万笔 支付宝再创新世界纪录
- android ndk-build 时出现target pattern contain no % 的解决方法