在手機開啟 Camera 其實很簡單,就類似撥放影片一樣,把 Camera 擷取的影像輸出到 SurfaceView 就可以了。

AndroidManifest.xml

在 AndroidManifest.xml 一定要加入 android.permission.CAMERA,不然程式一開啟就會閃退,因為 APP 沒有 CAMERA 的權限。

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="tw.jyhshin.cameratest" android:versionCode="1" android:versionName="1.0" xmlns:tools="http://schemas.android.com/tools"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="8" tools:ignore="OldTargetApi"/> <uses-permission android:name="android.permission.CAMERA" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="tw.jyhshin.cameratest.CameraTestActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>

CameraTestActivity.java

  • SurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS) 這個指令在 Android 4.0 已經不需要了,但是在 Android 2.x 沒寫會閃退,所以需要相容 Android 2.x 還是要留著。
  • Camera.setDisplayOrientation(90) 是因為硬體上的 Camera 鏡頭跟機身沒有平行,相差 90 度,所以 camera 影像要先旋轉 90 度才能跟機身平行顯示。
  • open → setPreviewDisplay → startPreview 就可以顯示 camera 的影像了。
  • 在 surfaceDestroyed 要做一次 Camera.release 釋放資源,免得按返回退出後,造成無法再次使用 Camera,這時候只能把 APP 終結才能再次使用 Camera。
import java.io.IOException; import android.hardware.Camera; import android.os.Bundle; import android.app.Activity; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.widget.LinearLayout; public class CameraTestActivity extends Activity implements SurfaceHolder.Callback { private SurfaceView mSurfaceview = null; private SurfaceHolder mSurfaceHolder = null; private Camera mCamera = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); setContentView(ll); mSurfaceview = new SurfaceView(this); mSurfaceHolder = mSurfaceview.getHolder(); mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); mSurfaceHolder.addCallback(this); ll.addView(mSurfaceview); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } @Override public void surfaceCreated(SurfaceHolder arg0) { try { mCamera = Camera.open(); mCamera.setDisplayOrientation(90); mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder arg0) { mCamera.release(); } }

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()