2016-07-01 26 views
1

Ich bin dabei, einen Android-Musik-Player zu entwickeln, der die folgenden Aktionen ausführt, sobald eine Shake-Aktion erkannt wird. Aktionen: 1. Nichts tun 2. Play oder Pause 3. Nächster Song 4. Vorheriger SongAccelerometer-Codierung funktioniert nicht in allen Telefonen

Ich habe eine Service-Klasse für die Schütteln Aktion erstellt und es ist wie folgt.

public class Shaker extends Service implements SensorEventListener { 

    SharedPreferences sharedPreferences; 
    private static final int MIN_TIME_BETWEEN_SHAKES_MILLISECS = 1000; 
    private long mLastShakeTime; 
    private SensorManager sensorManager; 
    private static final String SHAKE_ACTION_PREFERENCE = "shake_action_preference"; 
    private static final String SHAKE_THRESHOLD_PREFERENCE = "shake_threshold_preference"; 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    public void onCreate() { 

     sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
     super.onCreate(); 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     sensorManager.unregisterListener(this); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     sensorManager.registerListener(this, sensorManager 
      .getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); 

     return START_STICKY; 
    } 

    public void onStart(Intent intent, int startId) { 
     sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
     sensorManager.registerListener(this, sensorManager 
      .getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 

    @Override 
    public void onSensorChanged(SensorEvent event) { 

     if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
      long curTime = System.currentTimeMillis(); 
      if ((curTime - mLastShakeTime) > MIN_TIME_BETWEEN_SHAKES_MILLISECS) { 

       float x = event.values[0]; 
       float y = event.values[1]; 
       float z = event.values[2]; 

       double acceleration = Math.sqrt(Math.pow(x, 2) + 
        Math.pow(y, 2) + 
        Math.pow(z, 2)) - SensorManager.GRAVITY_EARTH; 
      Log.d("Acceleration", "Acceleration is " + acceleration + "m/s^2"); 

       String threshold = sharedPreferences.getString(SHAKE_THRESHOLD_PREFERENCE, "medium"); 

       float SHAKE_THRESHOLD; 
       if(threshold.equals("high")) 
        SHAKE_THRESHOLD = 40.5f; 
       else if(threshold.equals("low")) 
        SHAKE_THRESHOLD = 15.5f; 
       else 
        SHAKE_THRESHOLD = 25.5f; 
       if (acceleration > SHAKE_THRESHOLD) { 
        mLastShakeTime = curTime; 
        Log.d("Shake", "Shake, Rattle, and Roll"); 

        String opt = sharedPreferences.getString(SHAKE_ACTION_PREFERENCE, "nothing"); 
        Log.d("SharedPreference", opt); 
        Log.d("SharedPreference", threshold); 
        if(opt.equals("play")) { 
         MusicPlayer.playOrPause(); 
        } else if(opt.equals("next")) { 
         MusicPlayer.next(); 
        } else if(opt.equals("prev")) { 
         MusicPlayer.previous(getApplicationContext(), false); 
        } 
       } 
      } 
     } 
    } 
} 

Aber wenn ich die apk-Dateien in aktuellen Geräten laufen, die Schüttelfunktion arbeitet nur mit bestimmten Telefonen und nicht für alle Handys arbeiten.

Ich habe auf verschiedenen Handys mit dem gleichen Android OS versucht, aber es funktioniert in einem und funktioniert nicht in dem anderen.

Ich konnte nicht herausfinden, warum es so ist. Kann jemand dafür eine Lösung vorschlagen?

+0

Vielen Dank für Ihre Nachricht. Was ist die Frage? – Henry

+0

Entschuldigung dafür, dass ich meine Frage vorher nicht behandelt habe. – Frontier2016

+0

Was funktioniert nicht? Erhalten Sie keine Beschleunigungsmesserdaten? Erhalten Sie es, aber es ist nicht so hoch wie Sie erwarten? Kommt es langsamer als erwartet? Etwas anderes? Wir brauchen mehr Details. –

Antwort

0

Ich hatte dieses Problem. Die Methode onSensorChanged wird für alle Änderungen aufgerufen, aber bei einigen Geräten wird sie mehr als einmal aufgerufen. Dies verursacht ein Problem in der Logik des Codes. Ich löste dieses Problem, indem ich eine private statische boolesche Variable hinzufügte. (Diese Methode wird einmal aufgerufen.) Wenn diese Methode ausgeführt wird, wird diese Variable wahr.

@Override 
    public void onSensorChanged(SensorEvent event) { 
     if(!variable) { 
      variable=true; 
      ... 
      ... 
      variable=false; 
      } 
     } 
+0

Ich habe eine private statische boolesche Variable in mmy-Codierung hinzugefügt. Immer noch funktioniert es nicht – Frontier2016

+0

Setzen Sie Variable falsch am Ende? Ich habe meinen Code aktualisiert –

+0

Shokouhix danke für Ihre anhaltende Unterstützung, Nein, ich habe die Variable am Ende nicht falsch gesetzt. Ich werde das heute Abend tun und werde Sie das Feedback wissen lassen. Mein Handy ist Android 5.1 und meine Freunde Handy ist auch das gleiche Betriebssystem. Aber der Code funktioniert in seinem Handy und funktioniert nicht in meinem Handy. – Frontier2016