흔들기 동작이 감지되면 다음 작업을 수행하는 Android 뮤직 플레이어를 개발하는 중입니다. 작업 : 1. 아무 작업도하지 않음 2. 재생 또는 일시 중지 3. 다음 노래 4. 이전 노래모든 휴대 전화에서 가속도계 코딩이 작동하지 않습니다.
나는 떨림 동작을위한 서비스 클래스를 만들었으며 다음과 같습니다. 내가 실제 장치에서 APK 파일을 실행할 때, 흔들림이 기능은 특정 휴대폰에서만 작동하는 모든 휴대폰에서 작동하지 않습니다
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);
}
}
}
}
}
}
.
동일한 Android OS를 사용하는 다른 휴대 기기를 사용해 보았지만 다른 휴대 기기에서는 작동하지 않습니다.
왜 이런지 알 수 없었습니다. 아무도 이것에 대한 해결책을 제안 할 수 있습니까?
Google에 알려 주셔서 감사합니다. 질문이 뭐야? – Henry
죄송합니다. 이전에 제 질문에 동의하지 않으 셨습니다. – Frontier2016
작동하지 않습니다. 가속도계 데이터를받지 못하고 있습니까? 당신은 그것을 얻고 있습니까? 그러나 당신이 기대하는 것만 큼 높지는 않습니까? 예상보다 느린 속도가 올 것입니까? 다른 것? 세부 사항이 더 필요합니다. –