`

【android学习之十五】——多媒体2:相机Camera

 
阅读更多
二、多媒体之相机Camera

手机的相机功能是当前大家玩拍照的一个必备功能,本篇的学习,我认为网上的一篇博文的讲解更容易理解一下,这里就转一下博文,自己把自己遇到的的问题给补充进来。引用的博文地址: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);
    }
    

	@Override
	public void surfaceCreated(SurfaceHolder holder) {
		// TODO Auto-generated method stub
		Log.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 stub
		Log.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 stub
		Log.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 0
11-14 08:24:32.899: W/KeyCharacterMap(426): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
11-14 08:24:35.746: I/CameraActivity(426): 调用了CameraActivity的surfaceDestroyed方法

效果图:

分享到:
评论

相关推荐

    Android开发与应用——张荣,原书配套课件

    第2章 Android开发环境 2.1 Java开发环境安装 2.1.1 安装JDK 2.1.2 安装Eclipse 2.1.3 Eclipse中文包的安装 2.2 Android SDK 2.2.1 安装ADT 2.2.2 安装Android SDK 2.3 Android模拟器 2.3.1 创建...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序——...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序——...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序——...

    Google Android SDK开发范例大全的目录

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨-p411 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序...

    Google Android SDK 开发范例大全01

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨-p411 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序...

    Google Android SDK 开发范例大全02

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨-p411 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序...

    Google+Android+SDK开发范例大全

    7.13 内置影片播放器载入3gp电影——VideoViewWidget 7.14 自制3gp影片播放器——MediaPlayer与实现SurfaceView 7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 ...

    Google Android sdk 开发范例大全 部分章节代码

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨-p411 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序...

    Google Android SDK开发范例大全(完整版)

    7.15 相机预览及拍照临时文件——Camera及PictureCallback事件 第8章 当Android与Internet接轨 8.1 HTTPGET/POST传递参数——HTTP连接示范 8.2 在程序里浏览网页——WebView.loadUrl 8.3 嵌入HTML标记的程序——...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part1

    书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part3

    书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part2

    书名:《Android底层开发技术实战详解——内核、移植和驱动》(电子工业出版社.王振丽)。本书从底层原理开始讲起,结合真实的案例向读者详细介绍了android内核、移植和驱动开发的整个流程。全书分为19章,依次讲解...

    新版Android开发教程.rar

    ----------------------------------- Android 编程基础 1 封面----------------------------------- Android 编程基础 2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance ...

Global site tag (gtag.js) - Google Analytics