Android 加速计编码不适用于所有手机
我正在开发一款Android音乐播放器,一旦检测到震动动作,它将执行以下操作。行动:1。什么也不做2。播放或暂停3。下一首歌4。上一首歌 我已经为震动动作创建了一个服务类,如下所示Android 加速计编码不适用于所有手机,android,accelerometer,Android,Accelerometer,我正在开发一款Android音乐播放器,一旦检测到震动动作,它将执行以下操作。行动:1。什么也不做2。播放或暂停3。下一首歌4。上一首歌 我已经为震动动作创建了一个服务类,如下所示 public class Shaker extends Service implements SensorEventListener { SharedPreferences sharedPreferences; private static final int MIN_TIME_BETWEEN_SH
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);
}
}
}
}
}
}
但当我在实际设备中运行apk文件时,震动功能只在某些手机上起作用,而不是在所有手机上起作用
我在不同的手机上试用过相同的安卓操作系统,但它在其中一个系统中工作,在另一个系统中不工作
我不明白为什么会这样。有人能提出解决办法吗?我遇到了这个问题。onSensorChanged方法用于任何更改,但在某些设备中,它会被多次调用。这会导致代码逻辑出现问题。 我通过添加一个私有静态布尔变量解决了这个问题。(它导致此方法被调用一次)。此方法执行后,此变量变为true
@Override
public void onSensorChanged(SensorEvent event) {
if(!variable) {
variable=true;
...
...
variable=false;
}
}
我有这个问题。onSensorChanged方法用于任何更改,但在某些设备中,它会被多次调用。这会导致代码逻辑出现问题。 我通过添加一个私有静态布尔变量解决了这个问题。(它导致此方法被调用一次)。此方法执行后,此变量变为true
@Override
public void onSensorChanged(SensorEvent event) {
if(!variable) {
variable=true;
...
...
variable=false;
}
}
谢谢你告诉我们。问题是什么?很抱歉之前没有包括我的问题。什么不起作用?你没有得到加速计数据吗?你明白了吗,但没有你想象的那么高?是不是比你想象的要慢?还有别的吗?我们需要更多的细节。不,MusicLayer的加速计功能正在工作,但仅在某些手机上,而不是在所有手机上mobiles@Frontier2016你还没有回答盖布的问题:你说“不工作”是什么意思?请描述细节。如果没有进一步的细节,我怀疑没有人能帮助你。谢谢你告诉我们。问题是什么?很抱歉之前没有包括我的问题。什么不起作用?你没有得到加速计数据吗?你明白了吗,但没有你想象的那么高?是不是比你想象的要慢?还有别的吗?我们需要更多的细节。不,MusicLayer的加速计功能正在工作,但仅在某些手机上,而不是在所有手机上mobiles@Frontier2016你还没有回答盖布的问题:你说“不工作”是什么意思?请描述细节。如果没有进一步的细节,我怀疑没有人能够帮助你。我在mmy编码中添加了一个私有静态布尔变量。但它仍然不起作用。您是否在末尾将变量设置为false?我更新了我的代码Shokouhix,感谢您的持续支持,不,我没有在最后将变量设置为false。我今晚会这样做,并会让你知道反馈。我的手机是安卓5.1,我的朋友手机也是同样的操作系统。但是代码在他的手机上工作,在我的手机上不工作。我在最后设置了variable=false。我在mmy编码中添加了一个私有的静态布尔变量。但它仍然不起作用。您是否在末尾将变量设置为false?我更新了我的代码Shokouhix,感谢您的持续支持,不,我没有在最后将变量设置为false。我今晚会这样做,并会让你知道反馈。我的手机是安卓5.1,我的朋友手机也是同样的操作系统。但是代码在他的手机上工作,在我的手机上不工作。我在最后设置了variable=false。但它仍然不起作用。