2.1.4 汇总

   让我们来看一下完整的示例。下面编写的代码可在Android 2.2 和更高版本上运行,但是只须稍作改动,这段代码应该就能在Android 1.6 和更高版本上运行。在注释中特别注明了要求高于1.6版本的部分。

 

 1 package com.nthm.androidtest;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.IOException;
 5 import java.io.OutputStream;
 6 import java.util.Iterator;
 7 import java.util.List;
 8 import android.app.Activity;
 9 import android.content.ContentValues;
10 import android.content.res.Configuration;
11 import android.hardware.Camera;
12 import android.net.Uri;
13 import android.os.Bundle;
14 import android.provider.MediaStore.Images.Media;
15 import android.view.SurfaceHolder;
16 import android.view.SurfaceView;
17 import android.view.View;
18 import android.view.View.OnClickListener;
19 
20 public class SnapShot extends Activity implements OnClickListener,SurfaceHolder.Callback,Camera.PictureCallback{
21     private SurfaceView cameraView;
22     private SurfaceHolder surfaceHolder;
23     private Camera camera;
24     
25     @Override
26     protected void onCreate(Bundle savedInstanceState) {
27         super.onCreate(savedInstanceState);
28         setContentView(R.layout.snapshot);
29         cameraView=(SurfaceView) findViewById(R.id.CameraView);
30         
31         surfaceHolder=cameraView.getHolder();
32         surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
33         surfaceHolder.addCallback(this);
34         
35         cameraView.setFocusable(true);
36         cameraView.setFocusableInTouchMode(true);
37         cameraView.setClickable(true);
38         cameraView.setOnClickListener(this);
39     }
40     @Override
41     public void onClick(View v) {
42         camera.takePicture(null, null, this);
43         
44     }

  随后是之前所描述的onPictureTaken方法。

 1     @Override
 2     public void onPictureTaken(byte[] data, Camera camera) {
 3         Uri imageFileUri=getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());
 4         try {
 5             OutputStream imageFileOS=getContentResolver().openOutputStream(imageFileUri);
 6             imageFileOS.write(data);
 7             imageFileOS.flush();
 8             imageFileOS.close();
 9         } catch (FileNotFoundException e) {
10             e.printStackTrace();
11         }catch (IOException e) {
12             e.printStackTrace();
13         }
14         camera.startPreview();
15     }

   最后,需要使用各种的SurfaceView.Callback方法,在其中可以建立Camera对象。

 1     @Override
 2     public void surfaceCreated(SurfaceHolder holder) {
 3         camera=Camera.open();
 4     try {
 5         camera.setPreviewDisplay(holder);
 6         Camera.Parameters parameters=camera.getParameters();
 7         if(this.getResources().getConfiguration().orientation!=Configuration.ORIENTATION_LANDSCAPE){
 8             //这是一个众所周知但未文档化的特性
 9             parameters.set("orientation", "portrait");
10             //对于Android 2.2及其以上版本
11             camera.setDisplayOrientation(90);
12             //对于Android 2.0及其以上版本取消注释
13             parameters.setRotation(90);
14         }
15         //用于Android 2.0 和更高版本的效果
16         List<String> colorEffects=parameters.getSupportedColorEffects();
17         Iterator<String> cei=colorEffects.iterator();
18         while(cei.hasNext()){
19             String currentEffect=cei.next();
20             if(currentEffect.equals(Camera.Parameters.EFFECT_SOLARIZE)){
21                 parameters.setColorEffect(currentEffect);
22             }
23         }
24         //结束Android 2.0 和更高版本的效果
25         camera.setParameters(parameters);
26         } catch (IOException e) {
27             camera.release();
28         }
29     }
30 
31     @Override
32     public void surfaceChanged(SurfaceHolder holder, int format, int width,
33             int height) {
34         camera.startPreview();
35     }
36 
37     @Override
38     public void surfaceDestroyed(SurfaceHolder holder) {
39         camera.stopPreview();
40         camera.release();
41     }
42 }

    以上是Snapshot活动的代码。下面是该活动正在使用的布局XML,它位于res/layout/snapshot.xml中。

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     android:layout_width="match_parent"
 3     android:layout_height="match_parent"
 4     android:orientation="vertical"
 5     >
 6 <SurfaceView 
 7     android:id="@+id/CameraView"
 8     android:layout_width="match_parent"
 9     android:layout_height="match_parent"
10     />
11 </LinearLayout>

最后,需要在AndroidMainfest.xml文件中添加CAMERA权限。以下是整个代码清单。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.nthm.androidtest"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6 
 7     <uses-sdk
 8         android:minSdkVersion="8"
 9         android:targetSdkVersion="21" />
10     <uses-permission android:name="android.permission.CAMERA"/>
11     <application
12         android:allowBackup="true"
13         android:icon="@drawable/ic_launcher"
14         android:label="@string/app_name"
15         android:theme="@style/AppTheme" >
16         <activity
17             android:name=".SnapShot"
18             android:label="@string/app_name" >
19             <intent-filter>
20                 <action android:name="android.intent.action.MAIN" />
21 
22                 <category android:name="android.intent.category.LAUNCHER" />
23             </intent-filter>
24         </activity>
25     </application>
26 
27 </manifest>

   这个示例包括了构建一个基于摄像头的定制应用程序的基本要素。接下来,让我们看看如何扩展这个应用程序,实现在内置Camera应用程序中不存在的功能。

posted on 2014-08-22 10:58  宁静致远,一览众山小  阅读(136)  评论(0编辑  收藏  举报

导航