MOVERIO
BT-35E/30E ドキュメント

2. Androidアプリ開発

2.1. Androidアプリ開発の概要

Moverio向けのAndroidアプリケーションを開発するために必要となる手順について以下に記載します。

Android SDKの導入

Moverio SDKの組み込み

APIリファレンス

Moverio SDKの適用範囲

2.1.1. Android SDKの導入

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

2.1.1.1. Android Studioの入手

Android Studioを下記のサイトからダウンロードします。(2018年8月時点では、Android Studio 3.1.4)

https://developer.android.com/studio/

2.1.1.2. Android Studioのインストール

インストーラーの指示に従いAndroid Studioをインストールします。

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

2.1.1.3. Android Studioのプロキシ設定

プロキシ設定の必要なネットワーク環境でアプリケーションを開発する場合は、Android Studioのプロキシ設定を行ってください。下記のサイトで詳細な手順を確認してください。

https://developer.android.com/studio/intro/studio-config#gradle-plugin

プロキシ設定が不明な場合は、ネットワーク管理者にプロキシを利用した外部ネットワークへの接続方法についてお問い合わせください。

2.1.1.4. 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の設定が完了したパソコンとホスト機器の接続について記載します。

2.1.3.1. ホスト機器の設定

ホスト機器の開発者向けオプションを有効にしてください。次に、USBデバッグを有効にしてください。下記のサイトで詳細な手順を確認してください。

https://developer.android.com/studio/debug/dev-options

2.1.3.2. 接続確認方法

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

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

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

2.1.4. Moverio SDKの組み込み

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

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

apply plugin: 'com.android.application'

android {
        :
    // APIレベル24を追加
    minSdkVersion 24
        :
}

dependencies {
        :
    // MoverioSDK.aarを追加
    implementation files('libs/MoverioSDK_1.0.0.aar')
        :
        :
}

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

2.2. ディスプレイ制御

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

関連する情報を参照してください。

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

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

ディスプレイ制御機能の機種対応表

APIリファレンス

サンプルコード

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

Moverioはシースルー型のディスプレイを搭載しており、周辺環境の明るさの影響により表示映像の見やすさが変化します。周辺環境が明るい場合はディスプレイの明るさを強くし、周辺環境が暗い場合はディスプレイの明るさを弱くすることで表示映像を見やすくすることができます。

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

※Moverio 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;

例)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()メソッドを使用してください。

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();

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

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

Side-by-Side方式とは一つの画面に左右の画像を並べて格納する方式です。

Side-by-Side方式の映像を作成する場合は、映像の左半分と右半分に、それぞれ左目用映像と右目用映像を配置してください。

例えば、1280x720(HDサイズ)のSide-by-Side方式の映像を作成する場合は、下図のように左目用映像に640×720の映像を、右目用映像に640×720の映像を配置することで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()メソッドを使用してください。

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

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

Moverioはシースルー型のディスプレイを搭載しており、Moverioの装着者は実空間で見えている景色を見ながら表示される映像を重ね合わせてみることができます。実空間で見えている景色にMoverioで表示したいオブジェクトの映像を重ね合わせて見る場合は、表示したいオブジェクトの背景を黒にすることで、シースルーを活かした映像を作ることができます。

2.2.4. ディスプレイの明るさの範囲

調整できるディスプレイの明るさの範囲は、下表を参照してください。

機種 明るさの範囲
BT-35E/30E 0~20
BT-30C 0~20

2.3. カメラ制御

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

関連する情報を参照してください。

カメラスペック

プレビューの表示

カメラ映像データの取得

静止画/動画の撮影

カメラプロパティの変更

パーミッション要求

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

カメラ制御の注意事項

カメラ制御機能の機種対応表

APIリファレンス

サンプルコード

2.3.1. カメラスペック

項目 BT-35E
有効画素数 500万画素
カラー配列 RGB565
解像度/フレームレート 640×480, 60fps/30fps/15fps
1280×720, 60fps/30fps/15fps
1920×1080, 30fps/15fps
2592×1944, 15fps
露出補正モード auto/manual
手動露出補正ステップ -5 ~ +5
シャープネス 0 ~ +128
ホワイトバランス auto
/cloudy_daylight(6000K)/daylight(5500K)
/fluorescent(4200K)/incandescent(3200K)
/twilight(3500K)
電力線周波数 50Hz/60Hz

2.3.2. プレビューの表示

Moverio SDKを使用すると、Moverioに搭載されているカメラのプレビューを表示することができます。

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

※Moverio 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.sensor.SensorManagerのインスタンス生成

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

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

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

    private CaptureStateCallback mCaptureStateCallback =new CaptureStateCallback() {
        @Override
        public void onCaptureStarted() {
            mCameraDevice.startPreview();
        }
            :
            省略
            :
    };

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

        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        mCameraManager = new CameraManager(this);
        try {
            mCameraDevice = mCameraManager.open(mCaptureStateCallback, null, mSurfaceView.getHolder());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        mCameraDevice.startCapture();
    }

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

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

2.3.3. カメラ映像データの取得

Moverio SDKを使用すると、Moverioに搭載されているカメラの映像データを取得することができます。

カメラ映像データの取得は、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、データを受信するCaptureDataCallbackのインスタンスを引数で渡します。そして、CameraDeviceクラスのstartCapture()メソッドを呼び出すことで、open()メソッドの引数で渡したCaptureDataCallbackのインスタンスでデータを受信することができます。

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

カメラ映像データを取得している状態でアプリをバックグラウンドに移行した場合は、カメラ映像データの取得が停止します。カメラ映像データの取得を再開させるためには、再度startCapture()メソッドを呼び出します。

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

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

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

        mCameraManager = new CameraManager(this);
        try {
            mCameraDevice = mCameraManager.open(null, mCaptureDataCallback, mSurfaceView.getHolder());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        mCameraDevice.startCapture();
    }

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

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

2.3.4. 静止画/動画の撮影

Moverio SDKを使用すると、Moverioに搭載されているカメラの映像を静止画や動画として撮影することができます。

静止画/動画の撮影は、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、静止画撮影の完了や動画撮影の開始/終了のステータス通知を受信するCaptureStateCallbackのインスタンスを引数で渡します。次に、CameraDeviceクラスのstartCapture()メソッドを呼び出します。

静止画撮影する場合は、CameraDeviceクラスのtakePicture()メソッドを呼び出します。静止画撮影が完了した際に、open()メソッドの引数で渡したCaptureStateCallbackのインスタンスのonPictureCompleted()メソッドで静止画撮影完了の通知を受信することができます。

動画撮影を開始する場合はCameraDeviceクラスのstartRecord()メソッドを呼び出し、動画撮影を終了する場合はCameraDeviceクラスのstopRecord()メソッドを呼び出します。動画撮影の開始/終了した際に、open()メソッドの引数で渡したCaptureStateCallbackのインスタンスのonRecordStarted()メソッドやonRecordStopped()メソッドで動画撮影の開始/終了の通知を受信することができます。動画撮影は最大2時間実行できます。動画撮影の時間が2時間を超えた場合、強制的に動画撮影を終了します。また、動画撮影中にストレージ容量が10%を下回った場合も強制的に動画撮影を終了します。stopRecord()メソッドはActivityライフサイクルのonStop/onDestroyなどのメソッド内部での実行は、エラーとなります。

カメラの利用を終了する場合は、stopCapture()メソッドを呼び出してカメラ映像データの取得を停止し、close()メソッドを呼び出してカメラとの通信を切断してください。

2.3.5. カメラプロパティの変更

Moverio SDKを使用すると、Moverioに搭載されているカメラの各種プロパティを変更することができます。

カメラプロパティの変更は、最初にMoverioのカメラとの通信を確立します。これを行うには、CameraManagerクラスのインスタンスを作成して、open()メソッドを呼び出します。その際に、プレビュー表示に用いるSurfaceViewのSurfaceHolderかデータを受信するCaptureDataCallbackのインスタンスを引数で渡します。次に、CameraDeviceクラスのgetProperty()メソッドを呼び出し、現状のカメラプロパティをCameraPropertyクラスのインスタンスとして取得します。各種カメラプロパティの変更は、CameraPropertyクラスのインスタンスのsetXXX()メソッドを呼び出します。

例えば、カメラの露出ステップを変更する場合は、CameraPropertyクラスのsetExposureStep()メソッドを呼び出します。その際に、変更後のカメラの露出ステップを引数で渡します。

そして、CameraDeviceクラスのsetProperty()メソッドを呼び出し、変更後のカメラプロパティをカメラ映像に反映します。その際に、変更後のカメラプロパティであるCameraPropertyクラスのインスタンスを引数で渡します。

カメラプロパティは一部を除きstartCapture()メソッドの呼び出しによるカメラ映像のキャプチャ後でも変更可能です。

項目 キャプチャ前 キャプチャ後
解像度/フレームレート 変更可能 変更不可
露出補正モード 変更可能 変更可能
手動露出補正ステップ 変更可能 変更可能
シャープネス 変更可能 変更可能
ホワイトバランス 変更可能 変更可能
電力線周波数 変更可能 変更可能

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

手動露出補正ステップ 環境照度[lx] 最大フレームレート[fps]
+5 50 5.0
+4 100 10.0
+3 150 22.6
+2 200 30.1
+1 500 45.2
0(=default) 750 60.0*1
-1 1000 60.0*1
-2 1500 60.0*1
-3 2000 60.0*1
-4 4500 60.0*1
-5 9000 60.0*1

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

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

    private CaptureStateCallback mCaptureStateCallback =new CaptureStateCallback() {
        @Override
            public void onCaptureStarted() {
            mCameraDevice.startPreview();
        }
                :
                省略
                :
    };

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

        setContentView(R.layout.activity_camera);

        mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView);
        mCameraManager = new CameraManager(this);
        try {
            mCameraDevice = mCameraManager.open(mCaptureStateCallback, null, mSurfaceView.getHolder());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        mCameraDevice.startCapture();
        CameraProperty property = mCameraDevice.getProperty();
        property.setExposureMode(CameraProperty.EXPOSURE_MODE_MANUAL);
        property.setExposureStep(5);
        mCameraDevice.setProperty(property);
    }

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

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

2.3.6. パーミッション要求

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

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

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

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

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

[SDカードのパス]/Android/data/[パッケージ名]/[ファイル名]

2.3.8. カメラ制御の注意事項

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

2.4. センサー制御

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

関連する情報を参照してください。

センサーの種類

センサーの軸

センサーデータの取得

センサー制御機能の機種対応表

APIリファレンス

サンプルコード

2.4.1. センサーの種類

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²]で測定します。 モーション検知(傾きなど)
TYPE_LINEAR_ACCELERATION ソフトウェア 重力を除いた3軸(x、y、z)の加速度[m/s²]で測定します。 タップ、歩行の検出などへの応用
TYPE_ROTATION_VECTOR ソフトウェア Moverioの向きを回転ベクトルで測定します。 ヘッドトラッキングなど

2.4.2. センサーの軸

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

2.4.3. センサーデータの取得

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

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

※SensorManager#openは、MoverioとスマートフォンをUSB接続してから10秒以上経過後に、Moverioに映像が表示されていることを確認の上、実行してください。10秒以内にSensorManager#openを実行した場合は、正常に通信を確立できない場合があります。

※Moverio 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;

センサーデータは、登録されたリスナーのonSensorDataChanged()メソッドで随時取得できます。onSensorDataChanged()メソッドは、非常に高速に呼び出しされます。アプリケーションで効率的なセンサー利用を実現するために、onSensorDataChanged()メソッド内では、可能な限り時間のかかる処理などを実行しないようにしてください。最後に、センサーデータの取得を終了させる場合は、必ずMoverioのセンサーとの通信を解除してください。解除には、close()メソッドを使用してください。

センサーデータは、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);
    }

    @Override
    public void onSensorDataChanged(SensorData data) {
        // Do something with this sensor value.
    }
}

2.4.4. センサー制御の注意事項

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

2.5. オーディオ制御

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

関連する情報を参照してください。

イヤホンの音量の調整

オーディオ制御機能の機種対応表

APIリファレンス

サンプルコード

2.5.1. イヤホンの音量の調整

MoverioはCTIA規格に準拠したイヤホンを挿入することができます。周辺環境に合わせてイヤホンの音量を増減させることができます。

イヤホンの音量の調整には、最初にMoverioのオーディオとの通信を確立します。これを行うには、AudioManagerクラスのインスタンスを作成して、open()メソッドを呼び出してください。

※Moverio 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();

2.5.2. イヤホンの音量の範囲

調整できるイヤホンの音量の範囲は、下表を参照してください。

機種 音量の範囲
BT-35E/30E 0 ~ 15
BT-30C 0 ~ 20

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

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

2.7. KotlinからMoverio SDKを利用する

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

Moverio SDKの組み込み

Moverio SDK APIの実行例

2.7.1. Moverio SDKの組み込み

Kotlinが開発言語として選択されているプロジェクトに対してMoverio SDKの組み込みを実施してください。
Moverio SDKの組み込み方法は こちらを確認してください。

2.7.2. Moverio SDK APIの実行例

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

2.7.2.1. ディスプレイ制御

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

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

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

displayManager.close()
2.7.2.2. センサー制御

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

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.
    }
}
2.7.2.3. カメラ制御

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

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)
    }
}
Go to Top