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?
Vielen Dank für Ihre Nachricht. Was ist die Frage? – Henry
Entschuldigung dafür, dass ich meine Frage vorher nicht behandelt habe. – Frontier2016
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. –