android: perché getrotationmatrix torna falso?

Voglio avere l'orientamento del mio telefono e ho usato questo codice che trovo molte persone che lo usano. questo è il codice

public void onSensorChanged(SensorEvent event) { //if the data sensor is unreliabel if(event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) return; //gets the value switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: gravity = event.values.clone(); break; case Sensor.TYPE_MAGNETIC_FIELD: geomag = event.values.clone(); break; } getOrientation(); } private void getOrientation(){ //if gravity n geomag have value, find the rotation matrix if(gravity != null && geomag != null){ //check the rotation matrix found boolean success = SensorManager.getRotationMatrix(inR, I, gravity, geomag); if(success){ SensorManager.getOrientation(inR, orientVals); azimuth = Math.toDegrees(orientVals[0]); TextView azi = (TextView) findViewById(R.id.textAzi); azi.setText("azi : " + azimuth); } TextView cek = (TextView) findViewById(R.id.cek); cek.setText("rotation: "+success); } 

ma perché il getrotationmatrix torna sempre a falso? dov'è il problema?

  • Visualizzazione di un file MS Word in View (dire TextView) in Android
  • Android accelerometro e giroscopio
  • Applicazione dialer di Android
  • android visualizza diverse viste per each elemento
  • adb non trovare il mio dispositivo / telefono (MacOS X)
  • android: Rileva il livello sonoro
  • Come modificare la visibilità delle visualizzazioni widget (pulsanti) Android di programmazione
  • Retrofit - Come convertire la risposta in HashMap?
  • Problemi di modifica colore della barra dei titoli
  • Barra di stato trasparente non funziona con windowTranslucentNavigation = "false"
  • Impostare la visualizzazione di text e distriggersre e aggiungere altri dati alla fine
  • Firebase Nessuna properties; di serializzazione trovata nella class
  • 2 Solutions collect form web for “android: perché getrotationmatrix torna falso?”

    Ho provato di nuovo e ho trovato la soluzione, ma cambio il codice per diventare come sotto

      public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub switch (event.sensor.getType()) { case Sensor.TYPE_ACCELEROMETER: for(int i=0; i<3; i++){ accelValues[i] = event.values[i]; } if(compassValues[0] != 0) ready = true; break; case Sensor.TYPE_MAGNETIC_FIELD: for(int i=0; i<3; i++){ compassValues[i] = event.values[i]; } if(accelValues[2] != 0) ready = true; break; } if(!ready) return; boolean cek = SensorManager.getRotationMatrix(inR, inclineMatrix, accelValues, compassValues); if(cek){ SensorManager.getOrientation(inR, prefValues); mInclination = SensorManager.getInclination(inclineMatrix); //display every 30th values if(counter++ % 30 == 0){ //do your code, what you want to do to the result counter = 1; } } 

    e tutto funziona bene

    Assicurati di aver registrato i tuoi ascoltatori per ascoltare l'accelerometro, il field magnetico e il giroscopio (opzionale). Lo fai nel metodo onResume. Se si dimentica di farlo otterrà il valore di return "falso" quando si chiama getRotationMatrix.

    Spero che aiuti!

      protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); // do more staff here.. } protected void onResume() { super.onResume(); mSensorManager.registerListener( this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL ); mSensorManager.registerListener( this, mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_NORMAL ); mSensorManager.registerListener( this, mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL ); } protected void onPause() { super.onPause(); mSensorManager.unregisterListener(this); } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.