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

カメラのフォーカスを設定するには, カメラパラメータ(Camera.Parameters)を使用する.

フォーカスの設定

プレビュー画像を表示する」を参照して, カメラでプレビュー画像を表示できるようにする.
  • src/MainActivity.java
    • Camera#getParametersメソッドで, Camera.Parametersのインスタンスを取得する.
    • Camera.Parameters#getSupportedFocusModesメソッドで, サポートしているフォーカスモードを取得する.
    • Camera.Parameters#setFocusModeメソッドで, FOCUS_MODE_MACROを設定する.
    • Camera#setParametersメソッドで, Camera.Parametersを設定する.
定数名説明追加API Level
FOCUS_MODE_AUTOオートフォーカスモード5
FOCUS_MODE_CONTINUOUS_PICTURE写真撮影時の連続オートフォーカスモード14
FOCUS_MODE_CONTINUOUS_VIDEOビデオ記録時の連続オートフォーカスモード9
FOCUS_MODE_EDOF被写界深度拡大8
FOCUS_MODE_FIXEDフォーカス固定5
FOCUS_MODE_INFINITY無限遠に設定する5
FOCUS_MODE_MACROマクロモード5
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.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

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

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    SurfaceView preview = (SurfaceView)findViewById(R.id.preview_id);
    SurfaceHolder holder = preview.getHolder();
    holder.addCallback(this);
  }

  @Override
  public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    // カメラオープン
    mCamera = Camera.open();
    // パラメータ取得
    Camera.Parameters params = mCamera.getParameters();
    // サポートモード取得
    List< String > focusList = params.getSupportedFocusModes();
    for (int i=0; i < focusList.size();i++) {
      Log.v("CameraFocus", "Mode = " + focusList.get(i));
    }
    // フォーカスモード:マクロモードに設定
    params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
    // パラメータ設定
    mCamera.setParameters(params);
    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;
  }
}
  • AndroidManifest.xml
    • オートフォースを設定する場合, "android.hardware.camera.autofocus"で, オートフォーカス機能を備えたハードに限定する.
<?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="9"
    android:targetSdkVersion="21" />
  <uses-permission android:name="android.permission.CAMERA"/>
  <uses-feature android:name="android.hardware.camere"/>
  <uses-feature android:name="android.hardware.camere.autofocus"/>

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
      android:name=".MainActivity"
      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>
  • 動作例
端末:SHARP SHL-22 / Android 4.2.2



                 マクロモードの場合





コメントをかく


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

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

Menu


逆引き(基礎編)

画面表示/操作(49)

フラグメント(1)

逆引き(応用編)

Firebase(2)

AD



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