Moverio Basic Function SDK

Android & Windowsデベロッパーズガイド

2. Androidアプリ開発の概要

2.1. Moverio向けアプリ開発の概要

2.1.1 Android SDKの導入

以下の項目ではWindows10を搭載したパソコンにAndroid SDKを導入する方法について記載します。

Android Studioの入手

Android Studioを下記のサイトからダウンロードします。(2020年9月時点では、Android Studio 4.0.1)
https://developer.android.com/studio/

Android Studioのインストール

インストーラーの指示に従いAndroid Studioをインストールします。
例)C:¥Users¥<ユーザー名>¥AppData¥Local¥Android¥Sdk
※以降、上記フォルダにAndroid Studioがインストールされていることを前提に記載します。

Android Studioのプロキシ設定

プロキシ設定の必要なネットワーク環境でアプリケーションを開発する場合は、Android Studioのプロキシ設定を行ってください。下記のサイトで詳細な手順を確認してください。
https://developer.android.com/studio/intro/studio-config#gradle-plugin
プロキシ設定が不明な場合は、ネットワーク管理者にプロキシを利用した外部ネットワークへの接続方法についてお問い合わせください。

Android SDK Manager でのツールの取得・更新

アプリケーションの開発に必要なツール類は、Android SDK Managerを使用してください。下記のサイトで詳細な手順を確認してください。
https://developer.android.com/studio/intro/update#sdk-manager

2.1.2 USBドライバの設定

アプリケーション開発パソコンと接続するために、ご使用のホスト機器のUSBドライバの設定を行います。USBドライバの設定は、ご使用のホスト機器の設定手順をご確認ください。

2.1.3 ホスト機器とパソコンとの接続

ADB (Android Debug Bridge)の設定が完了したパソコンとホスト機器の接続について記載します。

ホスト機器の設定

ホスト機器の開発者向けオプションを有効にしてください。次に、USBデバッグを有効にしてください。下記のサイトで詳細な手順を確認してください。
https://developer.android.com/studio/debug/dev-options

接続確認方法

ADBの接続確認コマンドでパソコンとホスト機器が接続されているか確認することができます。
コマンドプロンプトを起動し、 "cd C:\Users\<user name>\AppData\Local\Android\sdk\platform-tools"
を実行しフォルダを移動します。
※環境変数で上記のPathを通しておくと便利です。

"adb devices"を実行してリストにデバイス名が表示されればADB接続ができています。

※表示されない場合は、ホスト機器をUSB接続しなおし、再度"adb devices"を実行してください。

2.1.4 Moverio Basic Function SDKの組み込み

下記利用方法は、Android Studio でのアプリケーション開発を前提としています。

Android StudioのProjectViewを表示し、[File]-[New]-[Directory]で"libs"フォルダを作成します。
C:¥Users¥<ユーザー名>¥AndroidStudioProjects¥<アプリケーション名>¥app¥libsが作成されますので、ここへ BasicFunctionSDK_1.2.1.aar を置きます。
(作成したプロジェクトのフォルダが C:¥Users¥<ユーザー名>¥AndroidStudioProjects の場合)
※以降、C:¥Users¥<ユーザー名>¥AndroidStudioProjects¥<アプリケーション名>にプロジェクトがあるものとして説明しています。
その後、アプリケーションの最小APIレベルを24で定義し、アプリケーションの依存関係にBasicFunctionSDK_1.2.1.aarを追加してください。

apply plugin: 'com.android.application'

android {
        :
    // define APIlevel 24
    minSdkVersion 24
        :
}

dependencies {
        :
    // add BasicFunctionSDK.aar
    implementation files('libs/BasicFunctionSDK_1.2.1.aar')
        :
        :
}

Android Studio上部のSync Project with Gradle Filesボタンを押して、Gradleの変更をプロジェクトに反映します。

build.gradleのminifyEnabledプロパティをtrueにした場合の注意事項

Moverio Basic Function SDKを込みこんだアプリケーションで、build.gradleのminifyEnabledプロパティをtrueにしてビルドする場合、Android StudioのバージョンによってはMoverio Basic Function SDKの機能が正常に動作できない場合があります。
minifyEnabledプロパティをtrueにする場合は、以下のようにアプリケーションのproguard-rules.proファイルで、Moverio Basic Function SDKのパッケージに含まれるクラスを難読化・最適化の対象から除外してください。

        :
 -keep class com.epson.moverio.** {*; }:
        :

2.2. ディスプレイ制御の概要

Moverioはシースルー型(透過型)のディスプレイを搭載しています。Moverio Basic Function SDKではディスプレイの明るさや2D/3D表示モードの切り替えなどを制御することができます。
ディスプレイの明るさは専用APIからの調整と周辺環境の照度に合わせた自動調整の方法を使用することができます。また、Side-by-Side方式の3Dコンテンツの表示に対応することが可能です。

ディスプレイの明るさの調整

Moverioはシースルー型のディスプレイを搭載しており、周辺環境の明るさの影響により表示映像の見やすさが変化します。周辺環境が明るい場合はディスプレイの明るさを強くし、周辺環境が暗い場合はディスプレイの明るさを弱くすることで表示映像を見やすくすることができます。
ディスプレイの明るさの調整には、最初にMoverioのディスプレイとの通信を確立します。これを行うには、DisplayManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。
※Moverio Basic Function SDKのDisplayManagerクラスの利用の際に、Android標準のDisplayManagerクラスとの名前衝突を回避するために、com.epson.moverio.hardware.display.DisplayManagerのインポートをする、もしくは、インスタンス生成時のクラス名をcom.epson.moverio.hardware.display.DisplayManagerとしてください。
例)com.epson.moverio.hardware.display.DisplayManagerのインポート

import com.epson.moverio.hardware.display.DisplayManager;
public class DisplayActivity extends Activity {
private com.epson.moverio.hardware.display.DisplayManager mDisplayManager = null;

次に、ディスプレイの明るさ調整モードを手動モード、もしくは、自動モードに設定します。設定には、setBrightnessMode()メソッドを使用します。手動モードの場合はBRIGHTNESS_MODE_MANUAL引数を渡して、自動モードの場合はBRIGHTNESS_MODE_AUTOMATIC引数を渡してください。ディスプレイの明るさ調整モードが自動モードの場合は、setBrightness()メソッドを使用したディスプレイの明るさの調整はできません。
そして、ディスプレイの明るさを手動で調整するには、setBrightness()メソッドを使用してディスプレイの明るさの調整をしてください。調整できるディスプレイの明るさの範囲は、ディスプレイの明るさの範囲を参照してください。

最後に、ディスプレイの明るさ調整を完了した場合は、必ずMoverioのディスプレイとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

private DisplayManager mDisplayManager = new DisplayManager(context);
try {
        mDisplayManager.open();
} catch (IOException e) {
        e.printStackTrace();
}
mDisplayManager.setBrightnessMode(DisplayManager.BRIGHTNESS_MODE_MANUAL);
mDisplayManager.setBrightness(15);
mDisplayManager.close();
mDisplayManager.release();

2D/3D表示モードの切り替え

Moverioのディスプレイは、Side-by-Side方式の3Dコンテンツの表示に対応しています。Moverioで表示する映像がSide-by-Side方式の3Dコンテンツの場合でアプリから制御する場合は、専用APIを使用してください。
Side-by-Side方式とは一つの画面に左右の画像を並べて格納する方式です。

Side-by-Side方式の映像を作成する場合は、映像の左半分と右半分に、それぞれ左目用映像と右目用映像を配置してください。
例えば、1280x720(HDサイズ)のSide-by-Side方式の映像を作成する場合は、下図のように左目用映像に640x720の映像を、右目用映像に640x720の映像を配置することでSide-by-Side方式の映像とすることができます。

ディスプレイの2D/3D表示モードの切り替えには、最初にMoverioのディスプレイとの通信を確立します。これを行うには、DisplayManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。
次に、ディスプレイの2D/3D表示モードを2D表示モード、もしくは、3D表示モードに設定します。設定には、setDisplayMode()メソッドを使用します。2D表示モードの場合はDISPLAY_MODE_2D引数を渡して、3D表示モードの場合はDISPLAY_MODE_3D引数を渡してください。
最後に、2D/3D表示モードの設定を完了した場合は、必ずMoverioのディスプレイとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

private DisplayManager mDisplayManager = new DisplayManager(context);
try {
        mDisplayManager.open();
} catch (IOException e) {
        e.printStackTrace();
}
mDisplayManager.setDisplayMode(DisplayManager. DISPLAY_MODE_3D);
mDisplayManager.close();
mDisplayManager.release();

ディスプレイの表示/非表示の設定

Moverioに表示されている映像を一時的に非表示にしたい場合は、専用APIを使用してください。専用APIの対応機種はディスプレイ制御機能の機種対応表を参照してください。

ディスプレイの表示/非表示の設定には、最初にMoverioのディスプレイとの通信を確立します。これを行うには、DisplayManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。
次に、ディスプレイを表示、もしくは、非表示に設定します。設定には、setDisplayState()メソッドを使用します。ディスプレイを表示する場合はDISPLAY_STATE_ON引数を渡して、ディスプレイを非表示にする場合はDISPLAY_STATE_OFF引数を渡してください。

最後に、ディスプレイの表示/非表示の設定を完了した場合は、必ずMoverioのディスプレイとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

private DisplayManager mDisplayManager = new DisplayManager(context);
try {
        mDisplayManager.open();
} catch (IOException e) {
        e.printStackTrace();
}
mDisplayManager.setDisplayState (DisplayManager.DISPLAY_STATE_OFF);
mDisplayManager.close();
mDisplayManager.release();

ディスプレイの仮想的な表示距離の調整

Moverioのディスプレイの表示距離を専用APIで調整することができます。専用APIは左右の表示映像を水平方向にシフトする機能があります。水平方向のシフト量に応じてディスプレイの輻輳を調整できます。

例えば、実際のオブジェクトがディスプレイの表示距離よりも近い位置にある場合は、下図のように左右の映像を内側にシフトします。
そうすることで、ディスプレイの仮想的な表示距離を近くにすることができます。

その他に、実際のオブジェクトがディスプレイの表示距離よりも遠い位置にある場合は、下図のように左右の映像を外側にシフトします。
そうすることで、ディスプレイの仮想的な表示距離を遠くにすることができます。

ただし、この機能を利用することで左右の映像をシフトさせるため、左右の映像の端が途切れてしまいます。そのため、アプリケーションで映像のシフト量に応じた画面構成の配慮が必要になります。
ディスプレイの仮想的な表示距離と映像のシフト量の関係性は、 ディスプレイの仮想的な表示距離の調整の範囲と水平方向のシフト量を参照してください。

ディスプレイの仮想的な表示距離の調整には、最初にMoverioのディスプレイとの通信を確立します。これを行うには、DisplayManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。

次に調整量のステップを設定します。設定には、setScreenHorizontalShiftStep()メソッドを使用します。調整量のステップは、ディスプレイの仮想的な表示距離の調整の範囲と水平方向のシフト量を参照してください。

最後に、調整を完了した場合は、必ずMoverioのディスプレイとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

private DisplayManager mDisplayManager = new DisplayManager(context);
try {
        mDisplayManager.open();
} catch (IOException e) {
        e.printStackTrace();
}
mDisplayManager. setScreenHorizontalShiftStep(39);
mDisplayManager.close();
mDisplayManager.release();

ディスプレイの自動スリープ設定

Moverioのディスプレイの自動スリープ設定を専用APIで設定することができます。専用APIの対応機種はディスプレイ制御機能の機種対応表を参照してください。

ディスプレイの自動スリープ設定を有効化した場合は、Moverioを脱着して机上などに置くと、自動的にディスプレイを消灯します。また、Moverioを装着すると自動的にディスプレイを表示します。この機能を有効にすることで、Moverioを装着していない場合の消費電力を低減させることができます。

ディスプレイの自動スリープ設定には、最初にMoverioのディスプレイとの通信を確立します。これを行うには、DisplayManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。

次に、ディスプレイの自動スリープ設定を有効化、もしくは、無効化に設定します。設定には、setDisplayAutoSleepEnabled()メソッドを使用します。設定を有効化する場合はDISPLAY_AUTO_SLEEP_ENABLE引数を渡して、設定を無効化する場合はDISPLAY_AUTO_SLEEP_DISABLE引数を渡してください。

最後に、設定を完了した場合は、必ずMoverioのディスプレイとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

private DisplayManager mDisplayManager = new DisplayManager(context);
try {
        mDisplayManager.open();
} catch (IOException e) {
        e.printStackTrace();
}
mDisplayManager. setDisplayAutoSleepEnabled(DisplayManager.DISPLAY_AUTO_SLEEP_ENABLE);
mDisplayManager.close();
mDisplayManager.release();

ディスプレイのユーザースリープ設定

Moverioのディスプレイのユーザースリープ設定を専用APIで設定することができます。専用APIの対応機種はディスプレイ制御機能の機種対応表を参照してください。

ディスプレイのユーザースリープ設定を有効化した場合は、Moverioの側面を軽くタップするとディスプレイを消灯します。また、再度Moverioの側面を軽くタップするとディスプレイを表示します。この機能は、Moverioの装着者が前面の映像を即座に消したい時などに利用できます。

ディスプレイのユーザースリープ設定には、最初にMoverioのディスプレイとの通信を確立します。これを行うには、DisplayManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。

次に、ディスプレイのユーザースリープ設定を有効化、もしくは、無効化に設定します。設定には、setDisplayUserSleepEnabled()メソッドを使用します。設定を有効化する場合はDISPLAY_USER_SLEEP_ENABLE引数を渡して、設定を無効化する場合はDISPLAY_USER_SLEEP_DISABLE引数を渡してください。

最後に、設定を完了した場合は、必ずMoverioのディスプレイとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

private DisplayManager mDisplayManager = new DisplayManager(context);
try {
        mDisplayManager.open();
} catch (IOException e) {
        e.printStackTrace();
}
mDisplayManager. setDisplayUserSleepEnabled(DisplayManager.DISPLAY_USER_SLEEP_ENABLE);
mDisplayManager.close();
mDisplayManager.release();

シースルーを活かした映像の作り方

Moverioはシースルー型のディスプレイを搭載しており、Moverioの装着者は実空間で見えている景色を見ながら表示される映像を重ね合わせてみることができます。

実空間で見えている景色にMoverioで表示したいオブジェクトの映像を重ね合わせて見る場合は、表示したいオブジェクトの背景を黒にすることで、シースルーを活かした映像を作ることができます。

2.3. センサー制御の概要

Moverioは動き、向き、環境を検知する様々なセンサーをヘッドセットに搭載しています。Moverio Basic Function SDKでは、これらのセンサーの生のデータを取得することができます。センサーデータを使用することで、装着者の頭の動きを推測したり、周辺環境の明るさを推測したりできます。

センサーの種類

Moverioは様々な種類のセンサーを搭載しています。センサーの中には、ハードウェアベースのセンサーとソフトウェアベースのセンサーがあります。

ハードウェアベースのセンサーには、加速度、地磁気、角速度、環境照度などがあります。ソフトウェアベースのセンサーは、単体もしくは複数のハードウェアベースのセンサーの出力値を使用した仮想のセンサーです。

ソフトウェアベースのセンサーには、回転ベクトルや重力などの推測が可能なものがあります。

センサー 種類 説明 使用例
TYPE_ACCELEROMETER ハードウェア 重力を含むMoverioの加速度を3軸(x、y、z)の加速度[m/s²]で測定します。 モーション検知(傾きなど)
TYPE_MAGNETIC_FIELD ハードウェア 周囲の地磁気を3軸(x、y、z)の地磁気[μT]で測定します。. 方位検知
TYPE_GYROSCOPE ハードウェア Moverioの角速度を3軸(x、y、z)の角速度[rad/s]で測定します。 モーション検知(回転など)
TYPE_LIGHT ハードウェア 周囲の照度[lx]を測定します。 周囲の照度に合わせたディスプレイの明るさ調整
TYPE_GRAVITY ソフトウェア 重力を3軸(x、y、z)の加速度[m/s^2]で測定します。 モーション検知(傾きなど)
TYPE_LINEAR_ACCELERATION ソフトウェア 重力を除いた3軸(x、y、z)の加速度[m/s^2]で測定します。 タップ、歩行の検出などへの応用
TYPE_ROTATION_VECTOR ソフトウェア Moverioの向きを回転ベクトルで測定します。 ヘッドトラッキングなど
TYPE_MAGNETIC_FIELD_UNCALIBRATED ソフトウェア 周囲の地磁気を未校正の3軸(x、y、z)の地磁気[μT]と校正情報の3軸(x_bias, y_bias, z_bias)で測定します。 方位検知、ヘッドトラッキングへの応用
TYPE_GAME_ROTATION_VECTOR ソフトウェア Moverioの向きを、地磁気を使用しない回転ベクトルで測定します。 ヘッドトラッキングなど
TYPE_GYROSCOPE_UNCALIBRATED ソフトウェア Moverioの角速度を未校正の3軸(x、y、z)の角速度[rad/s]と推定ドリフトの3軸(x_bias, y_bias, z_bias)で測定します。 モーション検知(回転など)、ヘッドトラッキングへの応用
TYPE_STATIONARY_DETECT ソフトウェア Moverioの静止を検知します。 ヘッドセット着脱検知など
TYPE_MOTION_DETECT ソフトウェア Moverioの動作を検知します。 ヘッドセット着脱検知など
TYPE_ACCELEROMETER_UNCALIBRATED ソフトウェア 重力を含むMoverioの加速度を未校正の3軸(x、y、z)の加速度[m/s²]と推定バイアス補償の3軸(x_bias, y_bias, z_bias)で測定します。 モーション検知(傾きなど)、ヘッドトラッキングへの応用
TYPE_HEADSET_TAP_DETECT ソフトウェア ヘッドセットのタップを検知します。 ヘッドセットタップ検知

詳細はAPIリファレンスを参照してください。

センサーの軸

Moverioのセンサーは、Android標準のセンサーの座標系と同じです。Moverioを装着した場合、X軸は右方向を指し、Y軸は上方向を指し、Z軸は装着者の方向を指します。

ヘッドセット

センサーデータの取得

Moverio Basic Function SDKを使用すると、Moverioに搭載されている各種センサーを使用することができます。

センサーデータの取得には、最初にMoverioのセンサーとの通信を確立します。これを行うには、SensorManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。その際に、センサーの種類とセンサーデータのリスナーのインスタンスを引数で渡してください。

※SensorManager#openは、MoverioとスマートフォンをUSB接続してから10秒以上経過後に、Moverioに映像が表示されていることを確認の上、実行してください。10秒以内にSensorManager#openを実行した場合は、正常に通信を確立できない場合があります。
※Moverio Basic Function SDKのSensorManagerクラスの利用の際に、Android標準のSensorManagerクラスとの名前衝突を回避するために、com.epson.moverio.hardware.sensor.SensorManagerのインポートをする、もしくは、インスタンス生成時のクラス名をcom.epson.moverio.hardware.sensor.SensorManagerとしてください。

例)com.epson.moverio.hardware.sensor.SensorManagerのインポート

import com.epson.moverio.hardware.sensor.SensorManager;

例)com.epson.moverio.hardware.sensor.SensorManagerのインスタンス生成

public class SensorActivity extends Activity implements SensorDataListener {
private com.epson.moverio.hardware.sensor.SensorManager mSensorManager = null;

対応するセンサーの種類はモデルによって異なります。対応するセンサーの種類は、getSupportedSensorList()メソッドで取得し、確認してください。

@Override
     public final void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
    
              mSensorManager = new SensorManager(this);
              // Get supported sensor list.
              List<Interger> sensorList = mSensorManager.getSupportedSensorList();
              Log.v("Sample", sensorList.toString();
     }

センサーデータは、登録されたリスナーのonSensorDataChanged()メソッドで随時取得できます。
onSensorDataChanged()メソッドは、非常に高速に呼び出しされます。

アプリケーションで効率的なセンサー利用を実現するために、onSensorDataChanged()メソッド内では、可能な限り時間のかかる処理などを実行しないようにしてください。

最後に、センサーデータの取得を終了させる場合は、必ずMoverioのセンサーとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

センサーデータは、SensorDataクラスのインスタンスとして取得できます。SensorDataクラスの詳細は、APIリファレンスを参照してください。

public class SensorActivity extends Activity implements SensorDataListener {
    private SensorManager mSensorManager = null;
    
    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        mSensorManager = new SensorManager(this);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    try {
        mSensorManager.open(SensorManager.TYPE_ACCELEROMETER, this);
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        mSensorManager.close(this);
        mSensorManager.release();
    }
    
    @Override
    public void onSensorDataChanged(SensorData data) {
        // Do something with this sensor value.
}

センサー制御の注意事項

Moverio Basic Function SDKを使用したセンサー制御は、単一のアプリでのみ利用することができます。別のアプリでセンサー制御を利用する場合は、必ずセンサー制御を利用しているアプリでセンサー制御の利用を停止してから、利用してください。
Android端末で同時に複数のセンサーを利用するとセンサーデータの取得頻度が低下する場合があります。

2.4. カメラ制御の概要

注意:Moverio Basic Function SDKのカメラ機能は、Android 10のスマートフォンでは正常に動作しない場合があります。カメラ機能を利用する場合は、以下の動作条件を必ず確認してください。

  targetSdkVersion 28 以上 targetSdkVersion 27 以下
Android 11 動作可能 動作可能
Android 10 動作不可 動作可能
Android 9以下 動作可能 動作可能

また、2021年11月以降にGoogle Playに登録するアプリケーションは、targetSdkVersionを30以上にする必要があります。
参考:https://developer.android.com/distribute/best-practices/develop/target-sdk
Moverio Basic Function SDKのカメラ機能を組み込んだアプリケーションをGoogle Playでリリースするためには、アプリケーションの対象とするAndroidのバージョンを9以下とする、もしくは、対象とするAndroidのバージョンを11とする必要があります。

注意:CaptureStateCallbackクラスは、廃止を予定しています。Version 1.1.0以降は、必ずCaptureStateCallback2クラスを利用してください。

Moverioは装着者の前面を撮影するカメラをヘッドセットに搭載しています。Moverio Basic Function SDKでは、カメラの映像データの取得や静止画/動画の撮影などができます。カメラの映像データを使用することで、通常の撮影に加え、マーカー認識などの用途に応用することができます。

カメラスペック

項目 BT-35E BT-45C
有効画素数 500万画素 800万画素
データフォーマット RGB565/ARGB8888 RGB565/ARGB8888/YUY2/H.264
[データフォーマット] [RGB565/ARGB8888] [RGB565/ARGB8888]
解像度/フレームレート 640x480, 60fps/30fps/15fps 640x480, 60fps/30fps
1280x720, 60fps/30fps/15fps
1920x1080, 30fps/15fps
2592x1944, 15fps
1280x720, 60fps/30fps
1920x1080, 30fps
1600x1200, 30fps
2560x1440, 20fps
3264x2448, 10fps
[YUY2]
640x480, 30fps
1280x720, 10fps
1920x1080, 5fps
1600x1200, 5fps
2560x1440, 2fps
3264x2448, 1fps
[H.264]
640x480, 60fps/30fps
1280x720, 60fps/30fps
1920x1080, 30fps
1600x1200, 30fps
2560x1440, 30fps
3264x2448, 30fps
露出補正モード auto/manual auto/manual
手動露出補正ステップ -5 ~ +5 -7 ~ +5
オートフォーカスモード off auto/manual
手動フォーカス - +30 ~ +3000 [mm]
シャープネス 0 ~ +128 -
明るさ -127 ~ +127 0 ~ +255
ゲイン 0 ~ +255 +1024 ~ +16383
ホワイトバランス auto
/cloudy_daylight(6000K)/daylight(5500K)
/fluorescent(4200K)/incandescent(3200K)
/twilight(3500K)
auto
/cloudy_daylight(6000K)/daylight(5500K)
/fluorescent(4200K)/incandescent(3200K)
/twilight(3500K)
電力線周波数 50Hz/60Hz 50Hz/60Hz/Disable
インジケーターモード auto auto/on/off

プレビューの表示

注意:Surfaceクラスのインスタンスを用いてプレビュー表示する場合は、 Surfaceクラスのインスタンスを引数としたプレビューの表示を参照してください。

Moverio Basic Function SDKを使用すると、Moverioに搭載されているカメラのプレビューを表示することができます。
プレビューの表示には、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、プレビュー表示に用いるSurfaceViewのSurfaceHolderを引数で渡します。次に、CameraDeviceクラスのstartCapture()メソッドを呼び出し、カメラ映像データの取得を開始します。そして、CameraDeviceクラスのstartPreview()メソッドを呼び出すことで、open()メソッドの引数で渡したSurfaceHolderのSurfaceViewにプレビューの映像が表示されます。

※Moverio Basic Function SDKのCameraManagerクラスの利用の際に、Android標準のCameraManagerクラスとの名前衝突を回避するために、com.epson.moverio.hardware.camera.CameraManagerのインポートをする、もしくは、インスタンス生成時のクラス名をcom.epson.moverio.hardware.camera.CameraManagerとしてください。

例)com.epson.moverio.hardware.camera.CameraManagerのインポート

import com.epson.moverio.hardware.camera.CameraManager;

例)com.epson.moverio.hardware. camera.CameraManagerのインスタンス生成

public class CameraActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
private com.epson.moverio.hardware.camera.CameraManager mCameraManager = null;

プレビューの表示を停止させたい場合は、stopPreview()メソッドを呼び出します。カメラの利用を終了する場合は、stopCapture()メソッドを呼び出してカメラ映像データの取得を停止させ、close()メソッドとrelease()メソッドを呼び出してカメラとの通信を切断します。

public class CameraActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    private CameraManager mCameraManager = null;
    private CameraDevice mCameraDevice = null;
    private SurfaceView mSurfaceView = null;
    private PermissionHelper mPermissionHelper = null;
    
    
    private CaptureStateCallback2 mCaptureStateCallback2 =new CaptureStateCallback2() {
        @Override
        public void onCameraOpened() {
            mCameraDevice.startCapture();
        }
        
        @Override
        public void onCaptureStarted() {
            mCameraDevice.startPreview();
        }

        @Override
        public void onPreviewStopped() {
            mCameraDevice.stopCapture();
        }

        @Override
        public void onCaptureStopped() {
            mCameraManager.close(mCameraDevice);
        }
                    :
                    省略
                    :
    };
    
    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        mPermissionHelper = new PermissionHelper(this);
    
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        mCameraManager = new CameraManager(this);
    try {
        mCameraDevice = mCameraManager.open(mCaptureStateCallback2, null, mSurfaceView.getHolder());
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
    
    @Override
    protected void onPause() {
        super.onPause();
            mCameraDevice.stopPreview();
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
            mCameraManager.release();
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

カメラ映像データの取得

注意:ByteBuffer形式でカメラ映像データを取得する場合は、 ByteBuffer形式でのカメラデータの取得を参照してください。

Moverio Basic Function SDKを使用すると、Moverioに搭載されているカメラの映像データを取得することができます。
カメラ映像データの取得は、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、データを受信するCaptureDataCallbackのインスタンスを引数で渡します。そして、CameraDeviceクラスのstartCapture()メソッドを呼び出すことで、open()メソッドの引数で渡したCaptureDataCallback のインスタンスでデータを受信することができます。
カメラ映像データの取得を停止させたい場合は、stopCapture()メソッドを呼び出します。カメラの利用を終了する場合は、close()メソッドとrelease()メソッドを呼び出してカメラとの通信を切断します。
カメラ映像データを取得している状態でアプリをバックグラウンドに移行した場合は、カメラ映像データの取得が停止します。カメラ映像データの取得を再開させるためには、再度startCapture()メソッドを呼び出します。

public class CameraActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    private CameraManager mCameraManager = null;
    private CameraDevice mCameraDevice = null;
    private SurfaceView mSurfaceView = null;
    private PermissionHelper mPermissionHelper = null;

    private CaptureDataCallback mCaptureDataCallback =new CaptureDataCallback() {
        @Override
        public void onCaptureData(long timestamp, byte[] data) {
            // Do something with this camera data.
        }
    };

    private CaptureStateCallback2 mCaptureStateCallback2 = new CaptureStateCallback2() {

        @Override
        public void onCameraOpened() {
            mCameraDevice.startCapture();
        }

        @Override
        public void onCaptureStopped() { 
            mCameraManager.close(mCameraDevice);
        }
                :
              省略
                :
    };

    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPermissionHelper = new PermissionHelper(this);
        mCameraManager = new CameraManager(this);
        try {
            mCameraDevice = mCameraManager.open(mCaptureStateCallback2, mCaptureDataCallback, mSurfaceView.getHolder());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
            mCameraDevice.stopCapture();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
            mCameraManager.release();
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

静止画/動画の撮影

注意:データフォーマットがH.264の場合は、静止画/動画の撮影はできません。
注意:静止画/動画の撮影を実行する場合は、必ず以下を参照してください。
https://developer.android.com/training/data-storage/use-cases#opt-out-scoped-storage

Moverio Basic Function SDKを使用すると、Moverioに搭載されているカメラの映像を静止画や動画として撮影することができます。
注意:
静止画/動画の撮影は、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、静止画撮影の完了や動画撮影の開始/終了のステータス通知を受信するCaptureStateCallback2のインスタンスを引数で渡します。次に、CameraDeviceクラスのstartCapture()メソッドを呼び出します。
静止画撮影する場合は、CameraDeviceクラスのtakePicture()メソッドを呼び出します。静止画撮影が完了した際に、open()メソッドの引数で渡したCaptureStateCallback2 のインスタンスのonPictureCompleted()メソッドで静止画撮影完了の通知を受信することができます。
動画撮影を開始する場合はCameraDeviceクラスのstartRecord()メソッドを呼び出し、動画撮影を終了する場合はCameraDeviceクラスのstopRecord()メソッドを呼び出します。動画撮影の開始/終了した際に、open()メソッドの引数で渡したCaptureStateCallback2 のインスタンスのonRecordStarted()メソッドやonRecordStopped()メソッドで動画撮影の開始/終了の通知を受信することができます。動画撮影は最大2時間実行できます。動画撮影の時間が2時間を超えた場合、強制的に動画撮影を終了します。また、動画撮影中にストレージ容量が10%を下回った場合も強制的に動画撮影を終了します。stopRecord()メソッドはActivityライフサイクルのonStop/onDestroyなどのメソッド内部での実行は、エラーとなります。
カメラの利用を終了する場合は、stopCapture()メソッドを呼び出してカメラ映像データの取得を停止し、close()メソッドとrelease()メソッドを呼び出してカメラとの通信を切断してください。

カメラプロパティの変更

Moverio Basic Function SDKを使用すると、Moverioに搭載されているカメラの各種プロパティを変更することができます。
カメラプロパティの変更は、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、プレビュー表示に用いるSurfaceViewのSurfaceHolderかデータを受信するCaptureDataCallbackのインスタンスを引数で渡します。次に、CameraDeviceクラスのgetProperty()メソッドを呼び出し、現状のカメラプロパティをCameraPropertyクラスのインスタンスとして取得します。各種カメラプロパティの変更は、CameraPropertyクラスのインスタンスのsetXXX()メソッドを呼び出します。
例えば、カメラの露出ステップを変更する場合は、CameraPropertyクラスのsetExposureStep()メソッドを呼び出します。その際に、変更後のカメラの露出ステップを引数で渡します。
そして、CameraDeviceクラスのsetProperty()メソッドを呼び出し、変更後のカメラプロパティをカメラ映像に反映します。その際に、変更後のカメラプロパティであるCameraPropertyクラスのインスタンスを引数で渡します。
カメラプロパティは一部を除きstartCapture()メソッドの呼び出しによるカメラ映像のキャプチャ後でも変更可能です。

項目 キャプチャ前 キャプチャ後
データフォーマット 変更可能 変更不可
解像度/フレームレート 変更可能 変更不可
露出補正モード 変更可能 変更可能
手動露出補正ステップ 変更可能 変更可能
オートフォーカスモード 変更可能 変更可能
手動フォーカス 変更可能 変更可能
シャープネス 変更可能 変更可能
明るさ 変更可能 変更可能
ゲイン 変更可能 変更可能
ホワイトバランス 変更可能 変更可能
電力線周波数 変更可能 変更可能
インジケーターモード 変更可能 変更可能

手動露出補正ステップは、利用環境の環境照度[lx]に応じて変更することができます。ただし、高い環境照度に対応した露出補正ステップは、高い環境照度に対応するためにカメラの露光時間を長くしているため、カメラ映像のフレームレートにも影響を与える場合があります。詳細は下表に記載します。

手動露出補正ステップ BT-35E BT-45C
環境照度[lx] 最大フレームレート[fps] 環境照度[lx] 最大フレームレート[fps]
+5 50 5.0 50 9.9
+4 100 10.0 100 20.0
+3 150 22.6 150 30.0
+2 200 30.1 200 40.0
+1 500 45.2 500 60.0 *1
0 (=default) 750 60.0 *1 750 60.0 *1
-1 1000 60.0 *1 1000 60.0 *1
-2 1500 60.0 *1 1500 60.0 *1
-3 2000 60.0 *1 2000 60.0 *1
-4 4500 60.0 *1 4500 60.0 *1
-5 9000 60.0 *1 9000 60.0 *1
-6 Not support Not support 25000 60.0 *1
-7 Not support Not support 50000 60.0 *1

*1 : Moverioのカメラ映像のフレームレートは、最大60[fps]となります。また、フレームレートはホスト機器の処理性能などにより低下する場合があります。

データフォーマット

Moverio Basic Function SDKを使用すると、Moverioに搭載されているカメラの出力するデータフォーマットを変更することができます。データフォーマットの変更は、 カメラプロパティの変更を参照してください。
RGB565/ARGB8888/YUY2は、AndroidのImageFormatの仕様に準拠する。
https://developer.android.com/reference/android/graphics/ImageFormat
H.264は、ITU-Tの仕様に準拠する。
https://www.itu.int/rec/T-REC-H.264

Surfaceクラスのインスタンスを引数としたプレビューの表示

Moverio Basic Function SDKを使用すると、Moverioに搭載されているカメラのプレビューを表示することができます。
プレビューの表示には、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、プレビュー表示に用いるSurfaceViewのSurfaceHolderをnullで渡します。次に、CameraDeviceクラスのsetPreviewSurface()メソッドの引数にSurfaceのインスタンスを指定して実行します。その後に、CameraDeviceクラスのstartCapture()メソッドを呼び出し、カメラ映像データの取得を開始します。そして、CameraDeviceクラスのstartPreview()メソッドを呼び出すことで、setPreviewSurface()メソッドの引数で渡したSurfaceHolderのSurfaceViewにプレビューの映像が表示されます。

プレビューの表示を停止させたい場合は、stopPreview()メソッドを呼び出します。カメラの利用を終了する場合は、stopCapture()メソッドを呼び出してカメラ映像データの取得を停止させ、close()メソッドとrelease()メソッドを呼び出してカメラとの通信を切断します。

public class CameraActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    private CameraManager mCameraManager = null;
    private CameraDevice mCameraDevice = null;
    private SurfaceView mSurfaceView = null;
    private PermissionHelper mPermissionHelper = null;
    
    private CaptureStateCallback2 mCaptureStateCallback2 =new CaptureStateCallback2() {
        @Override
        public void onCameraOpened() {
            // set Surface before CameraDevice#startCapture.
            mCameraDevice.setPreviewSurface(mSurfaceView.getHolder().getSurface());
            
            mCameraDevice.startCapture();
        }
                    :
                    省略
                    :
    };
    
    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPermissionHelper = new PermissionHelper(this);
    
        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        mCameraManager = new CameraManager(this); 
        try {
        // Set the third argument to null.
            mCameraDevice = mCameraManager.open(mCaptureStateCallback2, null, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

ByteBuffer形式でのカメラデータの取得

Moverio Basic Function SDKを使用すると、Moverioに搭載されているカメラの映像データを取得することができます。
カメラ映像データの取得は、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、データを受信するCaptureDataCallbackをnullで渡します。次に、CameraDeviceクラスのsetCaptureDataCallback()メソッドの引数にCaptureDataCallback2のインスタンスを指定して実行します。そして、CameraDeviceクラスのstartCapture()メソッドを呼び出すことで、setCaptureDataCallback()メソッドの引数で渡したCaptureDataCallback2のインスタンスでデータを受信することができます。
カメラ映像データの取得を停止させたい場合は、stopCapture()メソッドを呼び出します。カメラの利用を終了する場合は、close()メソッドとrelease()メソッドを呼び出してカメラとの通信を切断します。
カメラ映像データを取得している状態でアプリをバックグラウンドに移行した場合は、カメラ映像データの取得が停止します。カメラ映像データの取得を再開させるためには、再度startCapture()メソッドを呼び出します。

public class CameraActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    private CameraManager mCameraManager = null;
    private CameraDevice mCameraDevice = null;
    private PermissionHelper mPermissionHelper = null;

    private CaptureStateCallback2 mCaptureStateCallback2 =new CaptureStateCallback2() {
        @Override
        public void onCameraOpened() {
            // set instance of CaptureDataCallback2 before CameraDevice#startCapture.
            mCameraDevice.setCaptureDataCallback(mCaptureDataCallback2);

            mCameraDevice.startCapture();
         }
                      :
                  省略
                      :
    };

    private CaptureDataCallback2 mCaptureDataCallback2 =new CaptureDataCallback2() {
        @Override
        public void onCaptureData(long timestamp, ByteBuffer data) {
               // Do something with this camera data.
        }
    };

    @Override
    public final void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       mPermissionHelper = new PermissionHelper(this); 
       mCameraManager = new CameraManager(this); 
       try {
             // Set the second argument to null.
             mCameraDevice = mCameraManager.open(mCaptureStateCallback2, null, null);
       } catch (IOException e) {
              e.printStackTrace();
       }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
           super.onRequestPermissionsResult(requestCode, permissions, grantResults);
           mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

カメラのパーミッション要求

Moverio Basic Function SDKを用いて開発したアプリケーションをAndroid端末で初めて動作させる際に、Android端末の利用者に対しパーミッション要求を行います。要求するパーミッションは以下の通りです。

項目 要求タイミング
カメラ(Android9以降) CameraManager#open()メソッドの呼び出し時
USB通信 CameraManager#open()メソッドの呼び出し時
静止画/動画撮影時のストレージへのファイル書き込み CameraDevice#startCapture()メソッドの呼び出し時
録画時の録音許可 CameraDevice#startCapture()メソッドの呼び出し時

アプリケーションでは、ActivityCompat.OnRequestPermissionsResultCallbackインターフェースを実装し、利用者がパーミッションに許可したことを受信します。その際に、PermissionHelperクラスのonRequestPermissionResult()メソッドを呼び出し、Moverio Basic Function SDKへ利用者の許可を通知します。Moverio Basic Function SDKへ利用者の許可が通知されるとカメラ機能の利用が可能となります。

public class CameraActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    private PermissionHelper mPermissionHelper = null;
    
    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPermissionHelper = new PermissionHelper(this); 
                        :
                        :
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

SDカードに静止画/動画を保存する方法

静止画/動画の撮影結果をSDカードに保存するためには、SDカード内部のアプリケーション用データ保存領域へアクセスします。CameraDeviceクラスのtakePicture()メソッドやCameraDeviceクラスのstartRecord()メソッドに下記のパスを指定します。
[SDカードのパス]/Android/data/[パッケージ名]/[ファイル名]

カメラ制御の注意事項

Moverio Basic Function SDKを使用したカメラ制御は、単一のアプリでのみ利用することができます。別のアプリでカメラ制御を利用する場合は、必ずカメラ制御を利用しているアプリでカメラ制御の利用を停止してから、利用してください。

2.5. オーディオ制御の概要

MoverioはCTIA規格に準拠したイヤホンで音の入出力ができます。Moverio Basic Function SDKではイヤホンの音量を調整することができます。

イヤホンの音量の調整

周辺環境に合わせてイヤホンの音量を増減させることができます。
イヤホンの音量の調整には、最初にMoverioのオーディオとの通信を確立します。これを行うには、AudioManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。
※Moverio Basic Function SDKのAudioManagerクラスの利用の際に、Android標準のAudioManagerクラスとの名前衝突を回避するために、com.epson.moverio.hardware.audio.AudioManagerのインポートをする、もしくは、インスタンス生成時のクラス名をcom.epson.moverio.hardware.audio.AudioManagerとしてください。

例)com.epson.moverio.hardware.audio.AudioManagerのインポート

import com.epson.moverio.hardware.audio.AudioManager;

例)com.epson.moverio.hardware.audio.AudioManagerのインスタンス生成

public class AudioActivity extends Activity {
private com.epson.moverio.hardware.audio.AudioManager mAudioManager = null;

そして、イヤホンの音量を調整するには、setVolume()メソッドを使用してイヤホンの音量を調整してください。調整できるイヤホンの音量の範囲は、イヤホンの音量の範囲を参照してください。
最後に、イヤホンの音量の調整を完了した場合は、必ずMoverioのオーディオとの通信を解除してください。解除には、close()メソッドを使用してください。

private AudioManager mAudioManager = new AudioManager(context);
try {
        mAudioManager.open();
} catch (IOException e) {
       e.printStackTrace();
}
mAudioManager.setVolume(12);
mAudioManager.close();

オーディオゲインの調整

注意:オーディオゲイン調整の機能を利用することで、大音量になる場合があります。
機能を利用する際には、必ず製品マニュアルの「安全にお使いいただくために」を確認してください。

BT-45Cのビルトインスピーカーは、出力音量を増幅させることができます。
オーディオゲインの調整機能を利用するためには、AndroidManifest.xmlにオーディオゲイン調整用のカスタムパーミッションを宣言する必要があります。カスタムパーミッショは、build.gradleで宣言されているapplicationIdと".permission.AUDIO_GAIN"を連結した文字列となります。${applicationId}とすることで、build.gradleで定義されたapplicationIdを参照できます。

注意:BasicFunctionSDK Version1.2.0を利用して、Android11以降のスマートフォンでオーディオゲイン調整の機能を利用する場合は、AndroidManifest.xmlにpermission-groupを"com.epson.moverio.permission-group.MOVERIO"として定義する必要があります。

注意:BasicFunctionSDK Version 1.2.1以降では、オーディオゲイン調整の機能を利用する場合に、AndroidManifest.xmlにpermission-groupを指定する必要はありません。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
                    package="com.moverio.app.moveriosdksample2">
                    :
                    :
     <!-- Custom permission of Audio gain control -->
     <uses-permission android:name="${applicationId}.permission.AUDIO_GAIN" />

     <!-- The following required Android 11 or later for BasicFunctionSDK Version 1.2.0 only. -->
     <permission-group
         android:name="com.epson.moverio.permission-group.MOVERIO"
         android:label="@string/perm_label_audio_gain_control"
         android:description="@string/perm_description_audio_gain_control" />
                    :
                    :
</manifest>

オーディオゲインの調整には、最初にMoverioのオーディオとの通信を確立します。これを行うには、AudioManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。
※Moverio Basic Function SDKのAudioManagerクラスの利用の際に、Android標準のAudioManagerクラスとの名前衝突を回避するために、com.epson.moverio.hardware.audio.AudioManagerのインポートをする、もしくは、インスタンス生成時のクラス名をcom.epson.moverio.hardware.audio.AudioManagerとしてください。

例)com.epson.moverio.hardware.audio.AudioManagerのインポート

import com.epson.moverio.hardware.audio.AudioManager;

例)com.epson.moverio.hardware.audio.AudioManagerのインスタンス生成

public class AudioActivity extends Activity {
    private com.epson.moverio.hardware.audio.AudioManager mAudioManager = null;

そして、オーディオゲインを調整するには、setGainStep()メソッドを使用してイヤホンの音量を調整してください。調整できるオーディオゲインの範囲は、オーディオゲインの範囲を参照してください。
最後に、オーディオゲインの調整を完了した場合は、必ずMoverioのオーディオとの通信を解除してください。解除には、close()メソッドを使用してください。

public class AudioActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    private AudioManager mAudioManager = null;
    private PermissionHelper mPermissionHelper = null;
    private Button mButton = null;
    
    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        mAudioManager = new AudioManager(this); 
        try {
            mAudioManager.open();
        } catch (IOException e) {
            e.printStackTrace();
        }
                    :
        mButton_gainStepUp.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View v) {
                mAudioManager.setGainStep(3);
            }
        }
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
            mAudioManager.close();
            mAudioManager.release();
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

ヘッドセット音声出力モードの設定

注意:BT-45Cのオーディオ機能を利用する場合は、USBデバイスへのアクセス許可を2回行う必要があります。
注意:ヘッドセット音声出力モードの設定を完了した場合、Moverioのオーディオとの通信が自動的に解除されます。再度、MoverioBasicFunctionSDKで提供されるオーディオ機能を利用する場合は、必ずopen()メソッドを呼び出してください。

BT-45Cは、ヘッドセット音声出力モードを設定することができます。
ヘッドセット音声出力モードの設定機能を利用するためには、最初にMoverioのオーディオとの通信を確立します。これを行うには、AudioManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。
※Moverio Basic Function SDKのAudioManagerクラスの利用の際に、Android標準のAudioManagerクラスとの名前衝突を回避するために、com.epson.moverio.hardware.audio.AudioManagerのインポートをする、もしくは、インスタンス生成時のクラス名をcom.epson.moverio.hardware.audio.AudioManagerとしてください。

例)com.epson.moverio.hardware.audio.AudioManagerのインポート

import com.epson.moverio.hardware.audio.AudioManager;

例)com.epson.moverio.hardware.audio.AudioManagerのインスタンス生成

public class AudioActivity extends Activity {
private com.epson.moverio.hardware.audio.AudioManager mAudioManager = null;

そして、ヘッドセット音声出力モードを設定するには、setDeviceMode()メソッドを使用してください。設定できるヘッドセット音声出力モードは、以下を参照してください。

デバイスモード 説明
DEVICE_MODE_BUILTIN_AUDIO ビルトインスピーカー
DEVICE_MODE_AUDIO_JACK オーディオジャック

最後に、ヘッドセット音声出力モードの設定を完了した場合は、Moverioのオーディオとの通信が自動的に解除されます。再度、MoverioBasicFunctionSDKで提供されるオーディオ機能を利用する場合は、必ずopen()メソッドを呼び出してください。

public class AudioActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback {
    private AudioManager mAudioManager = null;
    private PermissionHelper mPermissionHelper = null;
    private Button mButton = null;
    
    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        mAudioManager = new AudioManager(this); 
        try {
            mAudioManager.open();
        } catch (IOException e) {
            e.printStackTrace();
        }
                    :
        mButton_deviceMode.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View v) {
                mAudioManager.setDeviceMode(AudioManager.DEVICE_MODE_BUILTIN_AUDIO);
            }
        }
    
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
            mAudioManager.close();
            mAudioManager.release();
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        mPermissionHelper.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

2.6. デバイス管理の概要

Moverioは、ホスト機器とのUSB接続/抜去やディスプレイの表示開始、各種デバイスの温度異常などのMoverioを利用する上で重要なシステム状態の変化を知ることができます。また、Moverioの機器固有の情報を使用できます。Moverio Basic Function SDKではシステムの状態の変化を検知することや機器固有の情報を取得することができます。システム状態の変化を検知することで、アプリケーションでMoverioが接続されたことを検知して機能を実行することやデバイスが高温になったことを検知してユーザーへ通知することができます。
そして、機器固有の情報を使用することで、アプリケーションで特定のMoverioのみを動作させる機器認証の仕組みを導入することができます。

システム状態の変化の検知

Moverio Basic Function SDKでは、USB接続/抜去やディスプレイの表示開始、各種デバイスの温度異常などのMoverioを利用する上で重要なシステム状態の変化を検知することができます。システム状態の変化を検知することで、アプリケーションでMoverioが接続されたことを検知して機能を実行することやデバイスが高温になったことを検知してユーザーへ通知することができます。
システム状態の変化の検知には、com.epson.moverio.system.HeadsetStateCallbackのインポートしてください。

import com.epson.moverio.system.HeadsetStateCallback;

この機能を利用するクラスにHeadsetStateCallbackインターフェースを実装し、registerHeadsetStateCallbackを実行してください。ホスト機器とのUSB接続を検知した場合はonHeadsetAttached()が呼び出され、USB抜去を検知した場合はonHeadsetDetached()が呼び出されます。また、ディスプレイの表示開始、各種デバイスの温度異常のシステム状態の変化を検知するためには、DeviceManagerクラスのインスタンスを作成して、open()メソッドの実行が完了している必要があります。DeviceManager#open()メソッドの実行が完了する前に、Moverioのディスプレイの表示が開始された場合や、各種デバイスの温度異常が発生してしまった場合は、システム状態の変化は検知することができません。最後に、DeviceManager#open()メソッドを実行したシステム状態の変化の検知を終了させる場合は、必ずMoverioとの通信を解除してください。解除には、close()メソッドとrelease()メソッドとunregisterHeadsetStateCallback()を使用してください。

public class HeadsetStateActivity extends Activity implements HeadsetStateCallback {
    private DeviceManager mDeviceManager = null;

    @Override
    public final void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mDeviceManager = new DeviceManager(this);
        mDeviceManager.registerHeadsetStateCallback(this);
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
            mDeviceManager.unregisterHeadsetStateCallback(this);
    }

    @Override
    public void onHeadsetAttached() {
        // Get notified when a headset connection is detected.
        try {
            mDeviceManager.open();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onHeadsetDetached() {
        // Get notified when a headset disconnection is detected.
        mDeviceManager.close();
        mDeviceManager.release();
    }

    @Override
    public void onHeadsetDisplaying() {
        // Get notified when a headset displaying started.
    }

    @Override
    public void onHeadsetTemperatureError() {
        // Get notified when a headset temperature error happened.
    }
}

機器固有の情報の取得

Moverioはモデル情報やヘッドセットシリアル番号などの機器固有の情報を使用できます。機器固有の情報を使用することで、アプリケーションで特定のMoverioのみを動作させる機器認証の仕組みを導入することができます。
機器固有の情報の取得には、最初にMoverioとの通信を確立します。これを行うには、DeviceManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。
次に、専用のAPIを使用することで機器固有の情報を取得することができます。モデル情報の取得には、getHeadsetProductName()メソッドを使用します。ヘッドセットシリアル番号の取得には、まず、isHeadsetSerialNumberAcquisitionSupported()メソッドで接続されているMoverioがヘッドセットシリアル番号の取得ができることを確認し、getHeadsetSerialNumber()メソッドを使用します。
最後に、機器固有の情報の取得を完了した場合は、必ずMoverioとの通信を解除してください。解除には、close()メソッドとrelease()メソッドを使用してください。

private DeviceManager mDeviceManager = new DeviceManager(context);
mDeviceManager = new DeviceManager(this);
try {
    mDeviceManager.open();
} catch (IOException e) {
    e.printStackTrace();
}
// Model information
Log.v("sample", mDeviceManager.getHeadsetProductName());
// Headset serial information
if (mDeviceManager.isHeadsetSerialNumberAcquisitionSupported()){
    Log.v("sample", mDeviceManager.getHeadsetSerialNumber());
}
mDeviceManager.close();
mDeviceManager.release();

2.7. ネットワークを介してアプリケーションをデバッグする

BT-35EなどのUSB接続型Moverioのアプリケーション開発では、USB接続型MoverioとAndroidスマートフォンをUSB接続しアプリケーション動作を確認します。このときパソコンとAndroidスマートフォンはUSB接続されていないためデバッグできません。

上記を解決する方法として、ネットワークを介してAndroidスマートフォンにadb接続することでUSB接続型MoverioとAndroidスマートフォンをUSB接続したまま開発する方法について記載します。下記サイトも合わせて確認ください。
https://developer.android.com/studio/command-line/adb#wireless

  1. パソコンとAndroidスマートフォンを同じネットワークに接続します。
  2. パソコンとAndroidスマートフォンをUSB接続します。
    ※以降、パソコンに接続されているAndroidスマートフォンは1台のみとして記載します。
  3. パソコンにおいて下記コマンドを実行し、Androidスマートフォンにネットワークを介してadb接続できるようにします。
    # adb tcpip 5555
  4. AndroidスマートフォンのIPアドレスを確認します。
    いくつかのAndroidスマートフォンにおいてIPアドレスは設定画面から確認できます。IPアドレスが表示される画面までの手順はAndroidスマートフォンによって異なります。詳しくはお手持ちのAndroidスマートフォンの操作方法を確認ください。
  5. パソコンにおいて下記コマンドを実行し、Androidスマートフォンにネットワークを介してadb接続します。
    # adb connect ip_address
    ex: adb connect 192.168.1.10
  6. パソコンとAndroidスマートフォンのUSB接続を解除します。
  7. パソコンにおいて下記コマンドを実行し、パソコンにAndroidスマートフォンがadb接続されていることを確認します。
    接続したデバイスが一覧に含まれることを確認します。
    接続されていない場合は以下を確認してください。
    • パソコンとAndroidスマートフォンが同じネットワークに接続されているか
    • 3.からの手順を何度か実行し、接続できないか
    • 6.で入力したIPアドレスに誤りはないか
    # adb devices
  8. Android Studioを用いてAndroidスマートフォンにアプリケーションをインストールし、アプリケーション動作を確認します。

2.8. KotlinからMoverio Basic Function SDKを利用する

KotlinからMoverio Basic Function SDKを利用する手順について以下に記載します。

Moverio Basic Function SDKの組み込み

Kotlinが開発言語として選択されているプロジェクトに対してMoverio Basic Function SDKの組み込みを実施してください。
Moverio Basic Function SDKの組み込み方法は以下を確認してください。
Androidアプリ開発の概要

Moverio Basic Function SDK APIの実行例

KotlinからのMoverio Basic Function SDK APIの実行例を記載します。

ディスプレイ制御

明るさの取得/設定の実行例を記載します。
ディスプレイ制御の詳細は以下を確認してください。
ディスプレイ制御の概要

val displayManager = DisplayManager(context)
val displayManager = DisplayManager(context)
try {
    displayManager.open()
} catch (e: IOException) {
    e.printStackTrace()
}

val brightness = displayManager.brightness // getBrightness
displayManager.brightness = brightness + 1 // setBrightness

displayManager.close()

センサー制御

加速度センサーのデータ取得の実行例を記載します。
センサー制御の詳細は以下を確認してください。
センサー制御の概要

class SensorActivity : Activity(), SensorDataListener {
    private var sensorManager: SensorManager? = null

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            
            sensorManager = SensorManager(this)
        }
        
        override fun onResume() {
            super.onResume()
                try {
                    sensorManager?.open(SensorManager.TYPE_ACCELEROMETER, this)
                } catch (e: IOException) {
                    e.printStackTrace()
                }
        }
        
        override fun onPause() {
            super.onPause()
                sensorManager?.close(this)
        }
        
        override fun onSensorDataChanged(SensorData data) {
            // Do something with this sensor value.
        }
    }

カメラ制御

プレビュー取得の実行例を記載します。
カメラ制御の詳細は以下を確認してください。
カメラ制御の概要

class CameraActivity : Activity()  {

    private var cameraManager: CameraManager? = null
    
    private var cameraDevice: CameraDevice? = null
    
    private var surfaceView: SurfaceView? = null
    
    private var captureStateCallback = object : CaptureStateCallback {
        override fun onCaptureStarted() {
            cameraDevice?.startPreview()
        }
                    :
                    省略
                    :
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.camera)
    
        surfaceView = findViewById(R.id.surfaceView)
        cameraManager = CameraManager(this)
        try {
            cameraManager?.open(captureStateCallback, null, surfaceView?.holder)
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }
    
    override fun onResume() {
        super.onResume()
            cameraDevice?.startCapture()
    }
    
    override fun onPause() {
        super.onPause()
            cameraDevice?.stopPreview()
            cameraDevice?.stopCapture()
    }
    
    override fun onDestroy() {
        super.onDestroy()
            cameraManager?.close(cameraDevice)
    }
}

2.9. Androidのマルチディスプレイの活用

Androidは、プラットフォームで複数のディスプレイへの画面出力をサポートしています。方法は2通りあり、”Presentaionクラスを使う方法“と“Android8以降のマルチディスプレイの機能を利用する方法”があります。”Presentaionクラスを使う方法“は、API level 17以降の対応端末で利用可能です。“Android8以降のマルチディスプレイの機能を利用する方法”は、Android8以降の対応端末で利用可能です。“Android8以降のマルチディスプレイの機能を利用する方法”は、既存のアプリケーションを改変することなく、Moverioへ画面出力することができます。ただし、アプリケーションへの入力操作などの対応は、機能を利用する端末に依存します。これらのAndroidプラットフォームの機能を活用することで、Moverioへの画面出力と端末の画面でそれぞれ構成することができます。
注意:“Android8以降のマルチディスプレイの機能を利用する方法”では、既存のアプリケーションのActivityが、マルチウィンドウモードに対応している必要があります。

関連する情報を参照してください。
Presentaionクラスを使う方法(外部サイト)
Android8以降のマルチディスプレイの機能を利用する方法(外部サイト)
サンプルコード

Go to Top