Moverio Basic Function SDK
Android & Windowsデベロッパーズガイド
以下の項目ではWindows10を搭載したパソコンにAndroid SDKを導入する方法について記載します。
Android Studioを下記のサイトからダウンロードします。(2020年9月時点では、Android Studio 4.0.1)
https://developer.android.com/studio/
インストーラーの指示に従いAndroid Studioをインストールします。
例)C:¥Users¥<ユーザー名>¥AppData¥Local¥Android¥Sdk
※以降、上記フォルダにAndroid Studioがインストールされていることを前提に記載します。
プロキシ設定の必要なネットワーク環境でアプリケーションを開発する場合は、Android Studioのプロキシ設定を行ってください。下記のサイトで詳細な手順を確認してください。
https://developer.android.com/studio/intro/studio-config#gradle-plugin
プロキシ設定が不明な場合は、ネットワーク管理者にプロキシを利用した外部ネットワークへの接続方法についてお問い合わせください。
アプリケーションの開発に必要なツール類は、Android SDK Managerを使用してください。下記のサイトで詳細な手順を確認してください。
https://developer.android.com/studio/intro/update#sdk-manager
アプリケーション開発パソコンと接続するために、ご使用のホスト機器のUSBドライバの設定を行います。USBドライバの設定は、ご使用のホスト機器の設定手順をご確認ください。
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"を実行してください。
下記利用方法は、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.** {*; }:
:
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();
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で表示したいオブジェクトの映像を重ね合わせて見る場合は、表示したいオブジェクトの背景を黒にすることで、シースルーを活かした映像を作ることができます。
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端末で同時に複数のセンサーを利用するとセンサーデータの取得頻度が低下する場合があります。
注意: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
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);
}
}
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カード内部のアプリケーション用データ保存領域へアクセスします。CameraDeviceクラスのtakePicture()メソッドやCameraDeviceクラスのstartRecord()メソッドに下記のパスを指定します。
[SDカードのパス]/Android/data/[パッケージ名]/[ファイル名]
Moverio Basic Function SDKを使用したカメラ制御は、単一のアプリでのみ利用することができます。別のアプリでカメラ制御を利用する場合は、必ずカメラ制御を利用しているアプリでカメラ制御の利用を停止してから、利用してください。
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);
}
}
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();
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
# adb tcpip 5555
# adb connect ip_address
ex: adb connect 192.168.1.10
# adb devices
KotlinからMoverio Basic Function SDKを利用する手順について以下に記載します。
Kotlinが開発言語として選択されているプロジェクトに対してMoverio Basic Function SDKの組み込みを実施してください。
Moverio Basic Function SDKの組み込み方法は以下を確認してください。
Androidアプリ開発の概要
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)
}
}
Androidは、プラットフォームで複数のディスプレイへの画面出力をサポートしています。方法は2通りあり、”Presentaionクラスを使う方法“と“Android8以降のマルチディスプレイの機能を利用する方法”があります。”Presentaionクラスを使う方法“は、API level 17以降の対応端末で利用可能です。“Android8以降のマルチディスプレイの機能を利用する方法”は、Android8以降の対応端末で利用可能です。“Android8以降のマルチディスプレイの機能を利用する方法”は、既存のアプリケーションを改変することなく、Moverioへ画面出力することができます。ただし、アプリケーションへの入力操作などの対応は、機能を利用する端末に依存します。これらのAndroidプラットフォームの機能を活用することで、Moverioへの画面出力と端末の画面でそれぞれ構成することができます。
注意:“Android8以降のマルチディスプレイの機能を利用する方法”では、既存のアプリケーションのActivityが、マルチウィンドウモードに対応している必要があります。
関連する情報を参照してください。
Presentaionクラスを使う方法(外部サイト)
Android8以降のマルチディスプレイの機能を利用する方法(外部サイト)
サンプルコード