2016-07-01 4 views
1

흔들기 동작이 감지되면 다음 작업을 수행하는 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를 사용하는 다른 휴대 기기를 사용해 보았지만 다른 휴대 기기에서는 작동하지 않습니다.

왜 이런지 알 수 없었습니다. 아무도 이것에 대한 해결책을 제안 할 수 있습니까?

+0

Google에 알려 주셔서 감사합니다. 질문이 뭐야? – Henry

+0

죄송합니다. 이전에 제 질문에 동의하지 않으 셨습니다. – Frontier2016

+0

작동하지 않습니다. 가속도계 데이터를받지 못하고 있습니까? 당신은 그것을 얻고 있습니까? 그러나 당신이 기대하는 것만 큼 높지는 않습니까? 예상보다 느린 속도가 올 것입니까? 다른 것? 세부 사항이 더 필요합니다. –

답변

0

이 문제가 발생했습니다. onSensorChanged 메서드는 변경 사항에 대해 호출되지만 일부 장치에서는 한 번 이상 호출됩니다. 이는 코드의 논리에 문제를 일으 킵니다. 개인 정적 부울 변수를 추가하여이 문제를 해결했습니다. 이 메서드는 한 번 호출됩니다.이 메서드를 실행하면이 변수가 true가됩니다.

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

mmy 코딩에서 개인 정적 부울 변수를 추가했습니다. 여전히 작동하지 않습니다 – Frontier2016

+0

끝에 변수를 거짓으로 설정합니까? 내 코드 –

+0

Shokouhix 님의 지속적인 지원에 감사드립니다. 아니요. 변수 끝에 거짓을 설정하지 않았습니다. 나는 오늘 밤 그것을 할 것이고 당신에게 피드백을 알릴 것이다. 내 모바일은 Android 5.1이며 내 모바일은 동일한 OS입니다. 그러나이 코드는 모바일에서 작동하며 모바일에서는 작동하지 않습니다. – Frontier2016

관련 문제