由于最近在弄摄像头的功能等等,先来个小Demo练练手,下面是完整的代码,功能略少,只有预览。
R.layout.activity_main
<span style="font-size:18px;"><strong><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SurfaceView
android:id="@+id/preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
</FrameLayout></strong></span>
<span style="font-size:18px;"><strong>package com.example.testcamera;
import java.io.IOException;
import android.support.v7.app.ActionBarActivity;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends ActionBarActivity implements SurfaceHolder.Callback {
private Camera camera;
private SurfaceHolder sh;
private boolean ispreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview);
sh = surfaceView.getHolder();
//Holder添加回调接口
sh.addCallback(this);
/*SURFACE_TYPE_PUSH_BUFFERS:surface_type_push_buffers表明该Surface不包含原生数据,
* Surface用到的数据由其他对象提供,
* 在Camera图像预览中就使用该类型的Surface,由Camera 负责提供给预览Surface数据,这样图像预
* 览会比较流畅。如果设置这种类型则就不能调用lockCanvas来获取Canvas对象了。*/
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
//SurfaceHolder.Callback回调的三个方法,surfaceCreated(),surfaceChanged(),surfaceDestroyed()
@Override
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open(); //打开相机,赋给对象camera
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(480, 320); //设置相机的参数,这里是设置它的预览的大小
camera.setParameters(parameters); //设置相机参数
try {
/*
* 关键语句:相机的设置预览显示
* 这是将SurfaceHolder sh 作为参数传递到 相机,但还没有开始
* */
<span style="color:#FF0000;">camera.setPreviewDisplay(sh);</span>
} catch (IOException e) {
System.out.println(e.getMessage()); //两种打印log的方法,Log.e(TAG,e.toString());在类开头的部分设置public static final String TAG
}
//开始预览,但不是拍照更不是自动对焦
camera.startPreview();
ispreview = true;
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (camera != null) {
if(ispreview){
//首先停止预览
camera.stopPreview();
}
//然后再释放camera
camera.release();
}
//设置camera为空
camera = null;
}
}
</strong></span>
Manifest文件
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testcamera"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.testcamera.MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>