Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 加速计编码不适用于所有手机_Android_Accelerometer - Fatal编程技术网

Android 加速计编码不适用于所有手机

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

我正在开发一款Android音乐播放器,一旦检测到震动动作,它将执行以下操作。行动:1。什么也不做2。播放或暂停3。下一首歌4。上一首歌

我已经为震动动作创建了一个服务类,如下所示

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。但它仍然不起作用。