参考:
视频教程:http://v.youku.com/v_show/id_XNjI5MzkzMjQ4.html
官方API档file:///D:/Android/androidstudio/sdk/docs/guide/topics/media/camera.html
java程序
1 package com.example.x_yp.system_camera;
2
3
4 import java.io.File;
5 import java.io.FileOutputStream;
6
7 import android.os.Bundle;
8 import android.util.Log;
9 import android.view.View;
10 import android.widget.Button;
11 import android.widget.FrameLayout;
12 import android.app.Activity;
13 import android.content.Context;
14 import android.content.pm.PackageManager;
15 import android.hardware.Camera;
16 import android.hardware.Camera.AutoFocusCallback;
17 import android.hardware.Camera.PictureCallback;
18
19 public class MainActivity extends Activity {
20 protected static final String TAG = "main";
21 private Camera mCamera;
22 private CameraPreview mPreview;
23 @Override
24 protected void onCreate(Bundle savedInstanceState) {
25 super.onCreate(savedInstanceState);
26 setContentView(R.layout.activity_main);
27
28 mCamera = getCameraInstance();
29
30 // 创建预览类,并与Camera关联,最后添加到界面布局中
31 mPreview = new CameraPreview(this, mCamera);
32 FrameLayout preview = (FrameLayout) findViewById(R.id.camera_preview);
33 preview.addView(mPreview);
34
35
36 Button captureButton = (Button) findViewById(R.id.button_capture);
37 captureButton.setOnClickListener(new View.OnClickListener() {
38 @Override
39 public void onClick(View v) {
40 // 在捕获图片前进行自动对焦
41 mCamera.autoFocus(new AutoFocusCallback() {
42
43 @Override
44 public void onAutoFocus(boolean success, Camera camera) {
45 // 从Camera捕获图片
46 mCamera.takePicture(null, null, mPicture);
47 }
48 });
49 }
50 });
51 }
52
53 /** 检测设备是否存在Camera硬件 */
54 private boolean checkCameraHardware(Context context) {
55 if (context.getPackageManager().hasSystemFeature(
56 PackageManager.FEATURE_CAMERA)) {
57 // 存在
58 return true;
59 } else {
60 // 不存在
61 return false;
62 }
63 }
64
65 /** 打开一个Camera */
66 public static Camera getCameraInstance() {
67 Camera c = null;
68 try {
69 c = Camera.open();
70 } catch (Exception e) {
71 Log.d(TAG, "打开Camera失败失败");
72 }
73 return c;
74 }
75
76 private PictureCallback mPicture = new PictureCallback() {
77
78 @Override
79 public void onPictureTaken(byte[] data, Camera camera) {
80 // 获取Jpeg图片,并保存在sd卡上
81 File pictureFile = new File("/sdcard/" + System.currentTimeMillis() + ".jpg");
82 try {
83 FileOutputStream fos = new FileOutputStream(pictureFile);
84 fos.write(data);
85 fos.close();
86 } catch (Exception e) {
87 Log.d(TAG, "保存图片失败");
88 }
89 }
90 };
91
92 @Override
93 protected void onDestroy() {
94 // 回收Camera资源
95 if(mCamera!=null){
96 mCamera.stopPreview();
97 mCamera.release();
98 mCamera=null;
99 }
100 super.onDestroy();
101 }
102
103 }
package com.example.x_yp.system_camera;
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
* 定义一个预览类
*/
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {
private static final String TAG = "main";
private SurfaceHolder mHolder;
private Camera mCamera;
public CameraPreview(Context context, Camera camera) {
super(context);
mCamera = camera;
// 通过SurfaceView获得SurfaceHolder
mHolder = getHolder();
// 为SurfaceHolder指定回调
mHolder.addCallback(this);
// 设置Surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到界面 在Android3.0之后弃用
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// 当Surface被创建之后,开始Camera的预览
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.d(TAG, "预览失败");
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Surface发生改变的时候将被调用,第一次显示到界面的时候也会被调用
if (mHolder.getSurface() == null){
// 如果Surface为空,不继续操作
return;
}
// 停止Camera的预览
try {
mCamera.stopPreview();
} catch (Exception e){
Log.d(TAG, "当Surface改变后,停止预览出错");
}
// 在预览前可以指定Camera的各项参数
// 重新开始预览
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
Log.d(TAG, "预览Camera出错");
}
}
}
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<FrameLayout
android:id="@+id/camera_preview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
/>
<Button
android:id="@+id/button_capture"
android:text="Capture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
/>
</LinearLayout>
权限设置
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />