C/C++プログラマの管理者が, Androidプログラムにチャレンジ. AndroidプログラミングのTipsをメモっていく予定です.

カメラのプレビュー画像の表示には, サーフェイスビュー(SurfaceView)を使用する.

プレビュー画像の表示

  • src/Camera02.java
    • SurfaceViewのインスタンスを取得する.
    • SurfaceHolderを取得し, コールバック関数を登録する.
    • SurfaceHolderのタイプを設定する.
    • SurfaceHolder.CallbackインタフェースのsurfaceCreatedメソッドをオーバーライドする.
      • Camera#openメソッドで, カメラをオープンする.
      • Camera#setPreviewDisplayメソッドで, プレビュー画面を設定する.
    • SurfaceHolder.CallbackインタフェースのsurfaceChangedメソッドをオーバーライドする.
      • Camera#stopPreviewメソッドで, プレビューを停止する.
      • Camera#getParametersメソッドで, Camera.Parametersのインスタンスを取得する.
      • Parameters#getSupportedPreviewSizesメソッドで, サポートしているプレビューサイズを取得する.
      • Parameters#setPreviewSizeメソッドで, パラメータにプレビューサイズを設定する.
      • Camera#setParametersメソッドでパラメータを設定する.
      • Camera#startPreviewメソッドで, プレビューを再開する.
    • SurfaceHolder.CallbackインタフェースのsurfaceDestroyedメソッドをオーバーライドする.
      • プレビュー中ならCamera#stopPreviewメソッドで, プレビューを停止する.
      • Camera#releaseメソッドで, カメラのリソースを解放する.
package com.moonlight_aska.android.camera02;

import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.Size;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class Camera02 extends Activity implements SurfaceHolder.Callback {
  private Camera mCamera = null;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    SurfaceView preview = (SurfaceView)findViewById(R.id.preview_id);
    SurfaceHolder holder = preview.getHolder();
    holder.addCallback(this);
    // holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); ← API Level 11以降では不要
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera = Camera.open();
    try {
      mCamera.setPreviewDisplay(holder);
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }

  @Override
  public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    // TODO Auto-generated method stub
    mCamera.stopPreview();
    // プレビュー画面のサイズ設定
    Camera.Parameters params = mCamera.getParameters();
    List<Size> previewSizes = params.getSupportedPreviewSizes();
    Size size = previewSizes.get(0);
    params.setPreviewSize(size.width, size.height);
    mCamera.setParameters(params);
    // プレビュー開始
    mCamera.startPreview();
  }

  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    mCamera.stopPreview();
    mCamera.release();
    mCamera = null;
  }
}
  • res/layout/main.xml
    • SurfaceViewを配置する.
<?xml version="1.0" encoding="utf-8"?>
<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/preview_id"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />

</LinearLayout>
  • AndroidManifest.xml
    • カメラを使用するには, "android.permission.CAMERA"パーミッションを設定する.
    • "android.hardware.camera"で, カメラ機能を備えたハードに限定する.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.moonlight_aska.android.camera02"
   android:versionCode="1"
   android:versionName="1.0">
  <uses-sdk android:minSdkVersion="8" />
  <uses-permission android:name="android.permission.CAMERA"/>
  <uses-feature android:name="android.hardware.camere"/>

  <application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Camera02"
       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>



コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

Firebase(2)

AD



管理人/副管理人のみ編集できます