![HW22 Smart Watch Setting / HW12 HW16 HW22 SmartWatch Setup / How to ad Custom WatchFace / Wearfitpro](https://i.ytimg.com/vi/SUxd7NtSfpA/hqdefault.jpg)
コンテンツ
- どのAndroidセンサーを使用できますか?
- 環境センサー:環境光の測定
- センサーデータの表示
- センサーとの通信:SensorManager、SensorEvents、およびリスナー
- 1. SensorManagerのインスタンスを取得します
- 2. lightTextViewへの参照を取得します
- 3.現在のデバイスにセンサーが存在するかどうかを確認します
- 4.センサーリスナーを登録する
- 5. SensorEventListenerコールバックを実装する
- onSensorChanged()
- onAccuracyChanged()
- 6.センサー値を取得する
- 7.リスナーの登録を解除します
- Androidの光センサーの使用:完成したコード
- 完成したAndroidセンサーアプリをテストする
- Androidの近接センサーで距離を測定
- ユーザーインターフェイスの作成
- 近接センサーからデータを取得する
- テスト:ユーザーはデバイスにどれだけ近づいていますか?
- モーションセンサー:多次元配列の処理
- リアルタイムのピッチおよびロールデータの表示
- アプリで回転ベクトルセンサーを使用する
- 1. TYPE_ROTATION_VECTORを使用します
- 2.センサーデータを翻訳する
- 3.プレースホルダー文字列を更新する
- 複数のセンサーデータの表示:完成したコード
- 最終的なAndroidセンサーアプリケーションのテスト
- まとめ
今日、ほとんどの最新のAndroidデバイスには、多数のセンサーが装備されています。
この情報はさまざまな方法で使用できます。アプリケーションが明るさや配色を自動的に調整できるように照明レベルを監視するかどうか、ユーザーがデバイスを傾けるなどのジェスチャーを使用してモバイルゲームと対話できるようにします。または、近接センサーを使用して、ユーザーがデバイスを耳に当てたときにタッチイベントを自動的に無効にします。
この記事では、さまざまなハードウェアおよびソフトウェアセンサーから光、近接、およびモーションデータを取得する3つのアプリケーションを作成します。また、これらのAndroidセンサーをリアルタイムで監視するため、アプリケーションは常に最新の情報にアクセスできます。
この記事の終わりまでに、Androidセンサーから単一のデータを抽出する方法、およびデータを多次元配列の形式で提供するセンサーを処理する方法がわかります。
どのAndroidセンサーを使用できますか?
Androidセンサーは、次のカテゴリに分類できます。
- 環境センサー。 これらは、気温、圧力、湿度、周囲光レベルなどの環境条件を測定します。
- 位置センサー。 このカテゴリには、近接センサーや地磁気センサーなど、デバイスの物理的な位置を測定するセンサーが含まれます。
モーションセンサー。 これらのセンサーはデバイスの動きを測定し、加速度センサー、重力センサー、ジャイロスコープ、回転ベクトルセンサーを含みます。
さらに、センサーは次のいずれかです。
- ハードウェアベース。これらはデバイスに組み込まれている物理的なコンポーネントであり、加速度や周囲の地磁気の強さなどの特定のプロパティを直接測定します。
- ソフトウェアベース、仮想センサーまたは複合センサーとも呼ばれます。これらは通常、複数のハードウェアベースのセンサーからのデータを照合します。この記事の終わりに向かって、回転ベクトルセンサーを使用します。回転ベクトルセンサーは、デバイスの加速度計、磁力計、ジャイロスコープのデータを結合するソフトウェアセンサーです。
環境センサー:環境光の測定
Androidの光センサーは、周囲の光を「ルクス」単位で測定します。これは、人間の目で知覚される光の強度です。センサーによって報告されるルクス値はデバイスによって異なる可能性があるため、アプリケーションで一貫した値が必要な場合は、アプリケーションで使用する前に生データを操作する必要があります。
このセクションでは、デバイスの光センサーから現在のルクス値を取得してTextViewに表示し、新しいデータが利用可能になるとTextViewを更新するアプリケーションを作成します。その後、この情報をさまざまなアプリで使用できます。たとえば、ライトセンサーから情報を取得し、現在のライトレベルに基づいてビームの強度を自動的に調整するトーチアプリケーションを作成できます。
選択した設定で新しいAndroidプロジェクトを作成し、始めましょう!
センサーデータの表示
最終的に光センサーから抽出したデータを表示するTextViewを追加します。このTextViewは、新しいデータが利用可能になるたびに更新されるため、ユーザーは常に最新の情報にアクセスできます。
プロジェクトのactivity_main.xmlファイルを開き、次を追加します。
次に、レイアウトで参照される「light_sensor」文字列リソースを作成する必要があります。プロジェクトのstrings.xmlファイルを開き、次を追加します。
「%1 $ .2f」は、表示する情報とそのフォーマット方法を指定するプレースホルダーです。
- %1. 同じ文字列リソースに複数のプレースホルダーを挿入できます。 「%1」は、単一のプレースホルダーを使用していることを示します。
- $.2. これは、アプリケーションが各着信浮動小数点値をフォーマットする方法を指定します。 「$ .2」は、値を小数点以下2桁に丸める必要があることを示します。
- F. 値を浮動小数点数としてフォーマットします。
一部のセンサーは他のセンサーよりも一般的ですが、すべてのデバイスがまったく同じハードウェアおよびソフトウェアにアクセスできると想定しないでください。一部のセンサーはAndroidプラットフォームの以降のリリースまで導入されなかったため、センサーの可用性はAndroidのバージョンによって異なる場合があります。
Androidセンサーフレームワークを使用して、特定のセンサーがデバイスに存在するかどうかを確認できます。その後、センサーの可用性に基づいてアプリケーションの一部を無効または有効にすることができます。または、アプリケーションの機能の一部が期待どおりに機能しないという説明を表示する場合があります。
strings.xmlファイルを開いたまま、「no_sensor」文字列を作成します。これは、光センサーが使用できない場合に表示されます。
特定のセンサーにアクセスしないとアプリケーションが優れたユーザーエクスペリエンスを提供できない場合は、この情報をマニフェストに追加する必要があります。たとえば、アプリでコンパスセンサーへのアクセスが必要な場合は、次を使用できます。
現在、アプリはコンパスセンサーを備えたデバイスにのみダウンロードできます。
これは視聴者を制限する可能性がありますが、誰かがあなたのアプリケーションをダウンロードできるようにするよりもはるかに少ない損害 保証された デバイスのセンサー構成が原因で、ユーザーエクスペリエンスが低下します。
センサーとの通信:SensorManager、SensorEvents、およびリスナー
デバイスの光センサーと通信するには、次の手順を完了する必要があります。
1. SensorManagerのインスタンスを取得します
SensorManagerは、デバイスのすべてのセンサーにアクセスするために必要なすべての方法を提供します。
まず、SensorManagerのインスタンスを保持する変数を作成します。
プライベートSensorManager lightSensorManager;
次に、Context.getSystemServiceメソッドを呼び出してContext.SENSOR_SERVICE引数を渡すことにより、SensorManagerのインスタンスを取得する必要があります。
lightSensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE);
2. lightTextViewへの参照を取得します
次に、TextViewオブジェクトを保持するプライベートメンバー変数を作成し、それをTextViewに割り当てる必要があります。
プライベートTextView lightTextView; ... ... ... lightTextView =(TextView)findViewById(R.id.lightTextView);
3.現在のデバイスにセンサーが存在するかどうかを確認します
特定のセンサーにアクセスするには、getDefaultSensor()メソッドを呼び出して、問題のセンサーに渡します。光センサーの型定数はTYPE_LIGHTであるため、次を使用する必要があります。
lightSensor = lightSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
このデバイスにセンサーが存在しない場合、getDefaultSensor()メソッドはnullを返し、「no_sensor」文字列を表示します。
文字列sensor_error = getResources()。getString(R.string.no_sensor); if(lightSensor == null){lightTextView.setText(sensor_error); }}
4.センサーリスナーを登録する
センサーに新しいデータがあるたびに、AndroidはSensorEventオブジェクトを生成します。このSensorEventオブジェクトには、イベントを生成したセンサー、タイムスタンプ、および新しいデータ値が含まれます。
最初は、単一のデータを返す光センサーと近接センサーに焦点を当てます。ただし、一部のセンサーは、各SensorEventに多次元配列を提供します。これには、回転ベクトルセンサーが含まれます。これについては、この記事の最後に向かって説明します。
これらのSensorEventオブジェクトについてアプリケーションに通知されるようにするには、SensorManagerのregisterListener()を使用して、その特定のセンサーイベントのリスナーを登録する必要があります。
registerListener()メソッドは、次の引数を取ります。
- アプリまたはアクティビティコンテキスト。
- 監視するセンサーのタイプ。
- センサーが新しいデータを送信する速度。レートを高くすると、アプリケーションにより多くのデータが提供されますが、より多くのシステムリソース、特にバッテリー寿命も使用します。デバイスのバッテリーを節約するには、アプリケーションに必要な最小限のデータを要求する必要があります。 SensorManager.SENSOR_DELAY_NORMALを使用して、200,000マイクロ秒(0.2秒)ごとに新しいデータを送信します。
センサーを聞くとデバイスのバッテリーが消耗するため、アプリケーションがバックグラウンドにある場合でもセンサーがデータを送信し続けるため、アプリケーションのonCreate()メソッドにリスナーを登録しないでください。
代わりに、アプリケーションのonStart()ライフサイクルメソッドでセンサーを登録する必要があります。
@Override protected void onStart(){super.onStart(); //現在のデバイスでセンサーが利用可能な場合... // if(lightSensor!= null){//….thenlisten // lightSensorManager.registerListener(this、lightSensor、SensorManager.SENSOR_DELAY_NORMAL); }}
5. SensorEventListenerコールバックを実装する
SensorEventListenerは、SensorManagerから通知を受信するインターフェイスです
新しいデータが利用可能になるか、センサーの精度が変わるたびに。
最初のステップは、クラスシグネチャを変更して、SensorEventListenerインターフェイスを実装することです。
パブリッククラスMainActivityはAppCompatActivityを拡張し、SensorEventListener {
次に、次のコールバックメソッドを実装する必要があります。
onSensorChanged()
このメソッドは、新しい各SensorEventに応答して呼び出されます。
多くの場合、センサーデータは急速に変化する可能性があるため、アプリケーションが定期的にonSensorChanged()メソッドを呼び出している可能性があります。アプリケーションをスムーズに実行し続けるには、onSensorChanged()メソッド内で可能な限り少ない作業を実行する必要があります。
@Override public void onSensorChanged(SensorEvent sensorEvent){// To //}
onAccuracyChanged()
センサーの精度が向上または低下した場合、AndroidはonAccuracyChanged()メソッドを呼び出し、SENSOR_STATUS_UNRELIABLEやSENSOR_STATUS_ACCURACY_HIGHなどの新しい精度値を含むセンサーオブジェクトを渡します。
ライトセンサーは精度の変更を報告しないため、onAccuracyChanged()コールバックを空のままにします。
@Override public void onAccuracyChanged(Sensor sensor、int i){//タスク//}}
6.センサー値を取得する
新しい値を取得するたびに、onSensorChanged()メソッドを呼び出し、「light_sensor」文字列を取得する必要があります。次に、文字列のプレースホルダーテキスト(%1 $ .2f)をオーバーライドし、更新された文字列をTextViewの一部として表示できます。
@Override public void onSensorChanged(SensorEvent sensorEvent){//センサーの現在の値// float currentValue = sensorEvent.values; //「light_sensor」文字列を取得し、新しい値を挿入してユーザーに表示します// lightTextView.setText(getResources()。getString(R.string.light_sensor、currentValue)); }
7.リスナーの登録を解除します
センサーは短時間で大量のデータを生成できるため、デバイスのリソースを保持するには、リスナーが不要になったときに登録を解除する必要があります。
アプリケーションがバックグラウンドにあるときにセンサーイベントのリッスンを停止するには、プロジェクトのonStop()ライフサイクルメソッドにunregisterListener()を追加します。
@Override protected void onStop(){super.onStop(); lightSensorManager.unregisterListener(this); }
onPause()でリスナーの登録を解除しないでください。Android7.0以降のアプリケーションは、一時停止状態ではあるが画面上に表示されたままの分割画面モードおよびピクチャーインピクチャーモードで実行できます。
Androidの光センサーの使用:完成したコード
上記のすべての手順を完了すると、プロジェクトのMainActivityは次のようになります。
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.widget.TextView; public class MainActivity extends AppCompatActivity // Implement the SensorEventListener interface // implements SensorEventListener {//変数を作成する// private Sensor lightSensor;プライベートSensorManager lightSensorManager;プライベートTextView lightTextView; @Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lightTextView =(TextView)findViewById(R.id.lightTextView); // SensorManagerのインスタンスを取得// lightSensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE); //光センサーを確認します// lightSensor = lightSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); //ライトセンサーが存在しない場合は、エラーを表示します// String sensor_error = getResources()。getString(R.string.no_sensor); if(lightSensor == null){lightTextView.setText(sensor_error); }} @Override protected void onStart(){super.onStart(); //現在のデバイスでセンサーが利用可能な場合... // if(lightSensor!= null){//….thenリスナーを登録// lightSensorManager.registerListener(this、lightSensor、//指定する頻度を指定する新しいデータを受信// SensorManager.SENSOR_DELAY_NORMAL); }} @Override protected void onStop(){super.onStop(); //リスナーの登録を解除します// lightSensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent sensorEvent){//センサーの現在の値// float currentValue = sensorEvent.values; //「light_sensor」文字列を取得し、新しい値を挿入して、TextView // lightTextView.setText(getResources()。getString(R.string.light_sensor、currentValue));を更新します。 } @Override //センサーの精度が変化した場合….// public void onAccuracyChanged(Sensor sensor、int i){// TO DO //}}
完成したAndroidセンサーアプリをテストする
物理的なAndroidスマートフォンまたはタブレットでこのアプリケーションをテストするには:
- プロジェクトをデバイスにインストールします(Android Studioツールバーから[実行]> [実行]を選択します)。
- デバイスによって異なりますが、多くの場合、光センサーは画面の右上にあります。光のレベルを操作するには、デバイスを光源に近づけてから遠ざけます。あるいは、デバイスを手で覆って、光を遮ることもできます。 「光センサー」の値は、利用可能な光の量に応じて増減します。
Android Virtual Device(AVD)を使用している場合、エミュレーターにはさまざまなセンサーイベントをシミュレートするために使用できる仮想センサーコントロールのセットがあります。エミュレータの「拡張コントロール」ウィンドウから、これらの仮想センサーコントロールにアクセスします。
- AVDにアプリケーションをインストールします。
- AVDの横には、一連のボタンが表示されます。次のスクリーンショットでカーソルが位置する3つの点線の「詳細」ボタンを見つけてクリックします。これにより、「拡張コントロール」ウィンドウが起動します。
- 左側のメニューで[仮想センサー]を選択します。
- 「追加センサー」タブを選択します。このタブには、さまざまな位置および環境センサーイベントをシミュレートするために使用できるさまざまなスライダーが含まれています。
- 「Light(lux)」スライダーを見つけて左右にドラッグし、シミュレートされた光レベルを変更します。アプリケーションは、これらの変化する値をリアルタイムで表示する必要があります。
完成したプロジェクトはGitHubからダウンロードできます。
Androidの近接センサーで距離を測定
環境センサーから情報を取得する方法を見てきました。この知識をどのように適用するか見てみましょう ポジション センサー。
このセクションでは、デバイスの近接センサーを使用して、スマートフォンやタブレットと他のオブジェクトとの距離を監視します。アプリケーションに音声機能がある場合、近接センサーは、スマートフォンがユーザーの耳につかまれているかどうか、たとえば電話で話しているときなどを判断するのに役立ちます。その後、この情報を使用してタッチイベントを無効にできるため、ユーザーが誤って電話を切ったり、会話中に他の不要なイベントが発生したりすることはありません。
ユーザーインターフェイスの作成
近接データを画面に表示するので、リアルタイムで更新を見ることができます。物事をシンプルに保つために、以前のアプリケーションのレイアウトの多くを再利用しましょう。
次に、strings.xmlファイルを開き、「proximity_sensor」文字列を作成します。繰り返しますが、この文字列にはプレースホルダーを含める必要があります。プレースホルダーには、最終的に近接センサーから抽出したデータが入力されます。
近接センサーからデータを取得する
ライトセンサーと同様に、Androidの近接センサーは単一のデータ値を返します。つまり、以前のアプリケーションのコードの多くを再利用できます。ただし、いくつかの大きな違いに加えて、このコードを理解しやすくする名前関連の変更がいくつかあります。
- SensorManagerのインスタンスを作成します。今回は、「proximitySensorManager」という名前を付けます。
- 「proximitySensorManager」のインスタンスを取得します。
- 「proximityTextView」への参照を作成します。
- getDefaultSensor()メソッドを呼び出して、TYPE_PROXIMITYセンサーに渡します。
- 近接センサーのリスナーを登録および登録解除します。
これらの調整を行った後、次のようになるはずです。
import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.hardware.SensorEventListener; import android.widget.TextView;パブリッククラスMainActivityはAppCompatActivityを拡張します// SensorEventListenerインターフェースを実装します// SensorEventListenerを実装します{//変数を作成します//プライベートSensor proximitySensor;プライベートSensorManager proximitySensorManager;プライベートTextView proximityTextView; @Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); proximityTextView =(TextView)findViewById(R.id.proximityTextView); // SensorManagerのインスタンスを取得// proximitySensorManager =(SensorManager)getSystemService(Context.SENSOR_SERVICE); //近接センサーの確認// proximitySensor = proximitySensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); //近接センサーが存在しない場合は、エラーを表示します// String sensor_error = getResources()。getString(R.string.no_sensor); if(proximitySensor == null){proximityTextView.setText(sensor_error); }} @Override protected void onStart(){super.onStart(); //現在のデバイスでセンサーが使用可能な場合... // if(proximitySensor!= null){//….thenリスナーを登録// proximitySensorManager.registerListener(this、proximitySensor、//指定する頻度を指定する新しいデータを受信// SensorManager.SENSOR_DELAY_NORMAL); }} @Override protected void onStop(){super.onStop(); //リスナーを登録解除してシステムリソースを保持します// proximitySensorManager.unregisterListener(this); } @Override public void onSensorChanged(SensorEvent sensorEvent){//センサーの現在の値// float currentValue = sensorEvent.values; //「proximity_sensor」文字列を取得し、新しい値を挿入してTextView // proximityTextView.setText(getResources()。getString(R.string.proximity_sensor、currentValue));を更新します} @Override //センサーの精度が変化した場合….// public void onAccuracyChanged(Sensor sensor、int i){//...TO DO //}}
テスト:ユーザーはデバイスにどれだけ近づいていますか?
このアプリケーションを物理的なAndroidスマートフォンまたはタブレットでテストするには、アプリケーションをデバイスにインストールしてから、画面に向かって手を動かし、もう一度動かして実験します。 「近接センサー」の値は、動きを記録する必要があります。
近接センサーはデバイスによって異なる可能性があることに注意してください。一部のデバイスでは、2つの近接値(「近く」を示すものと「遠い」を示すもの)しか表示されない場合があります。そのため、物理的なAndroidデバイスであまり変化がなくても驚かないでください。
エミュレーターでこのアプリケーションをテストするには:
- AVDにアプリケーションをインストールします。
- 3つの点線の「詳細」ボタンを見つけてクリックすると、「拡張コントロール」ウィンドウが起動します。
- ウィンドウの左側のメニューで[仮想センサー]を選択します。
- 「追加センサー」タブを選択します。
- 「近接」スライダーを見つけ、左右にドラッグして、デバイスに近づくオブジェクトをエミュレートし、さらに遠くに移動します。スライダーを操作すると、「近接センサー」の値が変わるはずです。
完成したプロジェクトはGitHubからダウンロードできます。
モーションセンサー:多次元配列の処理
ここまで、単一のデータ項目を提供するセンサーに焦点を合わせてきましたが、各SensorEventに多次元配列を提供するセンサーがいくつかあります。これらの多次元センサーにはモーションセンサーが含まれます。これについては、この最後のセクションで説明します。
モーションセンサーはあなたを助けることができます:
- ユーザー入力の代替方法を提供します。たとえば、モバイルゲームを開発している場合、ユーザーはデバイスを傾けてキャラクターを画面上で動かすことができます。
- ユーザーアクティビティを推測します。アクティビティトラッキングアプリを作成した場合、モーションセンサーを使用すると、ユーザーが車で移動中か、ジョギング中か、机に座っているかを判断できます。
- 方向をより正確に決定します。デバイスのモーションセンサーから座標を抽出し、地球の座標系に基づいて座標を変換して、デバイスの現在の方向を最も正確に把握することができます。
この最後のセクションでは、回転ベクトルセンサー(TYPE_ROTATION_VECTOR)を使用します。光センサーや近接センサーとは異なり、これはデバイスの加速度センサー、磁力計、ジャイロスコープセンサーからのデータを照合するソフトウェアセンサーです。このセンサーを使用するには、多くの場合、数学的な変換と変換を行う必要がありますが、デバイスに関するさまざまな非常に正確な情報も提供できます。
回転ベクトルセンサーを使用して測定するアプリケーションを作成します。
- ピッチ。 これは、デバイスの上から下への傾きです。
- ロール。 これは、デバイスの左から右への傾きです。
リアルタイムのピッチおよびロールデータの表示
2つのメトリックを測定しているため、2つのTextViewと2つの対応する文字列リソースを作成する必要があります。
strings.xmlファイルを開き、次を追加します。
アプリで回転ベクトルセンサーを使用する
以前のアプリケーションのコードの一部を再利用するため、回転ベクトルセンサーとの通信が以前とは大きく異なる領域に焦点を当てましょう。
1. TYPE_ROTATION_VECTORを使用します
回転ベクトルセンサーを使用しているため、getDefaultSensor()メソッドを呼び出してから、TYPE_ROTATION_VECTOR定数を渡す必要があります。
positionSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
2.センサーデータを翻訳する
従来の光および近接センサーとは異なり、モーションセンサーは、すべてのSensorEventに対してセンサー値の多次元配列を返します。これらの値は、標準の「X、Y、Z」座標系を使用してフォーマットされます。これは、デバイスがデフォルトの「自然な」方向に保持されている場合にデバイスに対して相対的に計算されます。
Androidはデバイスの現在の向きに合わせてこれらのX、Y、Z座標を切り替えません。そのため、デバイスがポートレートモードかランドスケープモードかに関係なく、「X」軸は変わりません。回転ベクトルセンサーを使用する場合、受信データを変換してデバイスの現在の回転に合わせる必要がある場合があります。
ほとんどのスマートフォンではポートレートがデフォルトの向きですが、これが当てはまるとは思わないでください すべて Androidデバイス、特にタブレット。この記事では、回転行列を使用してセンサーのデータを元のセンサーから変換し、 デバイス 座標系 地球の 座標系は、地球に対するデバイスの動きと位置を表します。必要に応じて、デバイスの現在の向きに基づいてセンサーデータを再マッピングできます。
まず、デバイスの座標系は標準の3軸X、Y、Z座標系であり、3軸の各点は3Dベクトルで表されます。これは、9つのfloat値の配列を作成する必要があることを意味します。
float rotationMatrix =新しいフロート。
次に、この配列をgetRotationMatrix()メソッドに渡すことができます。
SensorManager.getRotationMatrixFromVector(rotationMatrix、vectors); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z;
次のステップでは、SensorManager.remapCoordinateSystem()メソッドを使用して、デバイスの現在の向きに基づいてセンサーデータを再マッピングします。
SensorManager.remapCoordinateSystem()メソッドは、次の引数を取ります。
- 元の回転行列。
- 再マップする軸。
- この新しいデータを入力する配列。
アプリで使用するコードは次のとおりです。
float adjustRotationMatrix = new float; SensorManager.remapCoordinateSystem(rotationMatrix、worldAxisX、worldAxisZ、adjustedRotationMatrix);
最後に、SensorManager.getOrientationを呼び出して、adjustedRotationMatrixを使用するように指示します。
SensorManager.getOrientation(adjustedRotationMatrix、orientation);
3.プレースホルダー文字列を更新する
2つのデータセット(ピッチとロール)があるため、2つの個別のプレースホルダー文字列を取得し、それらに正しい値を入力してから、対応するTextViewを更新する必要があります。
pitchTextView.setText(getResources()。getString(R.string.pitch_sensor、pitch)); rollTextView.setText(getResources()。getString(R.string.roll_sensor、roll));
複数のセンサーデータの表示:完成したコード
上記の手順を実行すると、MainActivityは次のようになります。
import android.app.Activity; import android.os.Bundle; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.widget.TextView;パブリッククラスMainActivityは、アクティビティの実装SensorEventListenerを拡張します{private SensorManager motionSensorManager;プライベートセンサーmotionSensor;プライベートTextView pitchTextView;プライベートTextView rollTextView; private static final int SENSOR_DELAY = 500 * 1000; private static final int FROM_RADS_TO_DEGS = -57; @Override protected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pitchTextView =(TextView)findViewById(R.id.pitchTextView); rollTextView =(TextView)findViewById(R.id.rollTextView); try {motionSensorManager =(SensorManager)getSystemService(Activity.SENSOR_SERVICE); motionSensor = motionSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR); motionSensorManager.registerListener(this、motionSensor、SENSOR_DELAY); } catch(例外e){pitchTextView.setText(R.string.no_sensor); rollTextView.setText(R.string.no_sensor); }} @Override public void onAccuracyChanged(Sensor sensor、int precision){//タスク//} @Override public void onSensorChanged(SensorEvent event){if(event.sensor == motionSensor){update(event.values); }} private void update(float vectors){//回転行列を計算する// float rotationMatrix = new float; SensorManager.getRotationMatrixFromVector(rotationMatrix、vectors); int worldAxisX = SensorManager.AXIS_X; int worldAxisZ = SensorManager.AXIS_Z; //アクティビティの現在の方向に基づいてマトリックスを再マッピングします// float adjustRotationMatrix = new float; SensorManager.remapCoordinateSystem(rotationMatrix、worldAxisX、worldAxisZ、adjustedRotationMatrix); //デバイスの向きを計算// float orientation = new float; // float値の配列をgetOrientation()メソッドに供給します// SensorManager.getOrientation(adjustedRotationMatrix、orientation);フロートピッチ=方向* FROM_RADS_TO_DEGS;フロートロール=方向* FROM_RADS_TO_DEGS; //ピッチとロールの値でTextViewを更新します// pitchTextView.setText(getResources()。getString(R.string.pitch_sensor、pitch)); rollTextView.setText(getResources()。getString(R.string.roll_sensor、roll)); }}
完成したプロジェクトはGitHubからダウンロードできます。
最終的なAndroidセンサーアプリケーションのテスト
物理的なAndroidスマートフォンまたはタブレットでこの回転ベクトルAndroidセンサーアプリをテストするには:
- デバイスにアプリケーションをインストールします。
- スマートフォンまたはタブレットを平らな面に置きます。モーションセンサーは非常に感度が高いため、動きがないように見えるデバイスでも、ピッチとロールの値の変動を報告することは珍しくありません。
- ピッチをテストするには、デバイスの底部を持ち上げて、デバイスから離れるように傾けます。ピッチの値は劇的に変化するはずです。
- ロールをテストするには、デバイスの左側を持ち上げて左に傾けてみてください。ロール値に注意してください。
エミュレータでプロジェクトをテストしている場合:
- AVDにアプリケーションをインストールします。
- [詳細]を選択すると、[拡張コントロール]ウィンドウが起動します。
- 左側のメニューで[仮想センサー]を選択します。
- 「加速度計」タブが選択されていることを確認してください。このタブには、デバイスの位置と方向の変更をシミュレートできるコントロールが含まれています。
- さまざまなスライダー(回転:Z-Rot、X-Rot、Y-Rot、および移動:X、Y、およびZ)とさまざまな「デバイスの回転」ボタンを試してみて、アプリケーションの「ロールセンサー」にどのように影響するかを確認してください」および「ピッチセンサー」の値。
まとめ
この記事では、Androidセンサーの3つの主要なカテゴリからデータを取得する方法、つまり環境、位置、動き、およびこのデータをリアルタイムで監視する方法について説明しました。
興味深いまたはユニークな方法でセンサーを使用するAndroidアプリを見たことがありますか?以下のコメントでお知らせください!