Как преобразовать программу, которая использует SensorListener для SensoreVentListener

StackOverflow https://stackoverflow.com/questions/6394192

  •  29-10-2019
  •  | 
  •  

Вопрос

Я создаю приложение по имени CaporitApp.Я создал два класса по имени Compass.java и Rose.java.Это приложение было создано из учебного пособия, описанного на веб-сайте, и это использует устаревшую версию SensorListener.Класс Cass.java использует эту устаревшую версию.Приложение работало нормально, когда я использовал устаревшую версию.Затем я подумал конвертировать свое приложение в текущую версию, которая является SensoreVentListener.Но вращение компаса остановилась!Я застрял и не знаю, что делать.Пожалуйста, помогите мне.

compass.java с устаревшим интерфейсом SensorListener

  public class Compass extends Activity implements SensorListener {
  SensorManager sensorManager;
  static final int sensor = SensorManager.SENSOR_ORIENTATION;
  MyRose rose;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set full screen view
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    rose = new MyRose(this);

    setContentView(rose);

    // get sensor manager
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
  }

  // register to listen to sensors
  @Override
  public void onResume() {
    super.onResume();
    sensorManager.registerListener(this, sensor);
  }

  // unregister
  @Override
  public void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
  }

  // Ignore for now
  public void onAccuracyChanged(int sensor, int accuracy) {
  }

  // Listen to sensor and provide output
  public void onSensorChanged(int sensor, float[] values) {
    if (sensor != Compass.sensor)
      return;
    int orientation = (int) values[0];
    rose.setDirection(orientation);
  }
 }
.

compass.java с новым сенсоревентлистенером

     public class Compass extends Activity{
          SensorManager sensorManager;
          SensorEventListener    listener ;

          static final int sensor = SensorManager.SENSOR_ORIENTATION;
          Rose rose;

          /** Called when the activity is first created. */
          @Override
          public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);

           // Set full screen view
           getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
           WindowManager.LayoutParams.FLAG_FULLSCREEN);
           requestWindowFeature(Window.FEATURE_NO_TITLE);

           listener = new SensorEventListener()
           {
              @Override
          public void onSensorChanged(SensorEvent e)
          {   
              int orientation = (int) e.values[0];
              rose.setDirection(orientation);
          } 

          @Override
          public void onAccuracyChanged(Sensor arg0, int arg1) {
      // TODO Auto-generated method stub

       }
        };


        setContentView(rose);

       // get sensor manager
       sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
       sensorManager.registerListener(listener,       sensorManager.getDefaultSensor(sensor),SensorManager.SENSOR_MAGNETIC_FIELD);

      }

       // register to listen to sensors
       @Override
      public void onResume() {
      super.onResume();
      sensorManager.registerListener(listener, sensorManager.getDefaultSensor(sensor), SensorManager.SENSOR_MAGNETIC_FIELD);
      }

       // unregister
       @Override
       public void onPause() {
       super.onPause();
       sensorManager.unregisterListener(listener);
       }
     }
.

Это было полезно?

Решение

Я думаю, что это то, что вам нужно.

public class Compass extends Activity implements SensorEventListener {
  SensorManager sensorManager;
  static final int sensor = SensorManager.SENSOR_ORIENTATION;
  MyRose rose;
  private Sensor myCompassSensor;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set full screen view
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    rose = new MyRose(this);

    setContentView(rose);

    // get sensor manager
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    // get compass sensor (ie magnetic field)
    myCompassSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
  }

  // register to listen to sensors
  @Override
  public void onResume() {
    super.onResume();
    sensorManager.registerListener(this, myCompassSensor, SensorManager.SENSOR_DELAY_NORMAL);
  }

  // unregister
  @Override
  public void onPause() {
    super.onPause();
    sensorManager.unregisterListener(this);
  }

  // Ignore for now
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
      // TODO Auto-generated method stub
  }

  public void onSensorChanged(SensorEvent event) {
      // this check is unnecessary with only one registered sensor
      // but it's useful to know in case you need to add more sensors
      if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
          int orientation = (int) event.values[0];
          rose.setDirection(orientation);
      }
  }
}
.

Редактировать: Добавлена проверка, чтобы определить тип датчика

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top