Android Java - Blickrichtung des Users herausfinden

  • Java

    Android Java - Blickrichtung des Users herausfinden

    Guten Tag,

    ich versuche nun schon seit gut 2 Stunden herauszufinden, wie ich die Blickrichtung eines Users herausfinden kann.

    Das obere Ende des Handys soll dazu in meinem Fall dienen, da man das Handy ja meist so flach (also Bildschirm nach oben) hält, ergibt es hier ja am meisten Sinn, oder ich versteh's falsch..
    Das wäre laut Doku die Y Achse des Sensors. Leider habe ich da scheinbar den falschen Sensor erwischt.

    Hier Mein bisheriger code:
    MainActivity
    Spoiler anzeigen

    Quellcode

    1. package com.example.demo_direction;
    2. import android.app.Activity;
    3. import android.content.Context;
    4. import android.hardware.Sensor;
    5. import android.hardware.SensorEvent;
    6. import android.hardware.SensorEventListener;
    7. import android.hardware.SensorManager;
    8. import android.os.Bundle;
    9. import android.widget.TextView;
    10. public class MainActivity extends Activity {
    11. SensorManager mgr;
    12. TextView tx, ty, tz, maxx;
    13. float max;
    14. @Override
    15. public void onCreate(Bundle savedInstanceState) {
    16. super.onCreate(savedInstanceState);
    17. setContentView(R.layout.activity_main);
    18. tx = (TextView) findViewById(R.id.tvx);
    19. ty = (TextView) findViewById(R.id.tvy);
    20. tz = (TextView) findViewById(R.id.tvz);
    21. maxx = (TextView) findViewById(R.id.tvmaxx);
    22. max = 0;
    23. mgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    24. mgr.registerListener(listener,
    25. mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
    26. SensorManager.SENSOR_DELAY_NORMAL);
    27. }
    28. @Override
    29. public void onDestroy() {
    30. super.onDestroy();
    31. mgr.unregisterListener(listener);
    32. }
    33. private SensorEventListener listener = new SensorEventListener() {
    34. @Override
    35. public void onSensorChanged(SensorEvent event) {
    36. if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    37. float x, y, z;
    38. x = event.values[0];
    39. y = event.values[1];
    40. z = event.values[2];
    41. if (x > max) {
    42. max = x;
    43. }
    44. // update textviews
    45. tx.setText("X: " + x);
    46. ty.setText("Y: " + y);
    47. tz.setText("Z: " + z);
    48. maxx.setText("Max: " + max);
    49. }
    50. }
    51. @Override
    52. public void onAccuracyChanged(Sensor sensor, int accuracy) {
    53. // unused
    54. }
    55. };
    56. }


    activity_main.xml
    Spoiler anzeigen

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical" >
    6. <TextView
    7. android:id="@+id/tvx"
    8. android:layout_width="match_parent"
    9. android:layout_height="86dp" />
    10. <TextView
    11. android:id="@+id/tvy"
    12. android:layout_width="match_parent"
    13. android:layout_height="89dp" />
    14. <TextView
    15. android:id="@+id/tvz"
    16. android:layout_width="match_parent"
    17. android:layout_height="108dp" />
    18. <TextView
    19. android:id="@+id/tvmaxx"
    20. android:layout_width="match_parent"
    21. android:layout_height="136dp" />
    22. </LinearLayout>


    EDIT:

    Scheinbar klappt es jetzt so:
    Spoiler anzeigen

    Quellcode

    1. package com.example.demo_direction;
    2. import android.app.Activity;
    3. import android.hardware.Sensor;
    4. import android.hardware.SensorEvent;
    5. import android.hardware.SensorEventListener;
    6. import android.hardware.SensorManager;
    7. import android.os.Bundle;
    8. import android.util.Log;
    9. public class MainActivity extends Activity implements SensorEventListener {
    10. public static float swRoll;
    11. public static float swPitch;
    12. public static float swAzimuth;
    13. public static SensorManager mSensorManager;
    14. public static Sensor accelerometer;
    15. public static Sensor magnetometer;
    16. public static float[] mAccelerometer = null;
    17. public static float[] mGeomagnetic = null;
    18. public void onAccuracyChanged(Sensor sensor, int accuracy) {
    19. }
    20. @Override
    21. public void onSensorChanged(SensorEvent event) {
    22. // onSensorChanged gets called for each sensor so we have to remember
    23. // the values
    24. if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
    25. mAccelerometer = event.values;
    26. }
    27. if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
    28. mGeomagnetic = event.values;
    29. }
    30. if (mAccelerometer != null && mGeomagnetic != null) {
    31. float R[] = new float[9];
    32. float I[] = new float[9];
    33. boolean success = SensorManager.getRotationMatrix(R, I,
    34. mAccelerometer, mGeomagnetic);
    35. if (success) {
    36. float orientation[] = new float[3];
    37. SensorManager.getOrientation(R, orientation);
    38. // at this point, orientation contains the azimuth(direction),
    39. // pitch and roll values.
    40. double azimuth = 180 * orientation[0] / Math.PI;
    41. double pitch = 180 * orientation[1] / Math.PI;
    42. double roll = 180 * orientation[2] / Math.PI;
    43. Log.d("direction", String.valueOf(azimuth));
    44. }
    45. }
    46. }
    47. @Override
    48. protected void onCreate(Bundle savedInstanceState) {
    49. super.onCreate(savedInstanceState);
    50. mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    51. accelerometer = mSensorManager
    52. .getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
    53. magnetometer = mSensorManager
    54. .getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
    55. }
    56. @Override
    57. protected void onResume() {
    58. super.onResume();
    59. mSensorManager.registerListener(this, accelerometer,
    60. SensorManager.SENSOR_DELAY_GAME);
    61. mSensorManager.registerListener(this, magnetometer,
    62. SensorManager.SENSOR_DELAY_GAME);
    63. }
    64. @Override
    65. protected void onPause() {
    66. super.onPause();
    67. mSensorManager.unregisterListener(this, accelerometer);
    68. mSensorManager.unregisterListener(this, magnetometer);
    69. }
    70. }


    *Topic verschoben*
    Polling is trolling!

    Achtung: Ich habe die komische Angewohnheit, simple Dinge zu verkomplizieren..

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcus Gräfe“ ()