2012-11-30 5 views
2

진동이없는 서비스가 있지만 화면이 꺼지면 진동이 멈 춥니 다. 올바른 BroadcastReceiver를 추가 한 후에는 화면을 켜거나 끈 후에 반복적으로 진동을 재생할 수 없다는 것을 알았습니다. 아래의 예 간단한 코드 :SCREEN_ON 의도 후 진동 반복을 시작할 수 없습니다.

//VibratingService class 
Vibrator mVibrator; 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    mVibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE); 

    IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      vibrate(); 
     } 
    }, filter); 

    vibrate(); 
    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    mVibrator.cancel(); 
    super.onDestroy(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

private void vibrate() { 
    Log.d("TAG", "vibrate"); 
    mVibrator.vibrate(new long[] { 1000, 500 }, 0); //doesn't work 
    //mVibrator.vibrate(new long[] { 1000, 500 }, -1); //works 
} 

반복이 진동 방법에 매개 변수 (반복되지 않음) -1로 설정하면 진동이 작동, 이상한, 그러나 다른 값으로 설정하면 작동하지 않습니다 무엇.

어떤 아이디어, 해결 방법? 아니면 그냥 다른 휴대폰에서 작동합니까? 나는 구글 넥서스에 그것을 runned 및 4.1.2 안드로이드

편집 :

는 몇 가지 테스트 후 나는 것으로 확인 : 화면이 꺼져 가기 전에 그들이 중지 된 경우

  • 진동이 제대로 시작됩니다 (하지만 inleceive - 너무 늦은 것 같습니다.)
  • "시스템 진동"(예 : 화면 잠금 해제)은 다음 화면으로 진동이 올바르게 시작되도록합니다. 그는 확실히 패턴에 연결되어 - - 진동 (긴 밀리)와 그런 문제가 없다 - 모두가 잘 작동

에게 내가 찾을 수없는 경우이

  • (EDIT2) 등 옆에 "휴식"까지 어떤 "정상적인"솔루션이라도 나는 아마도 내 자신의 Vibrator 클래스를 만들어야 할 것입니다 ...

  • +0

    mVibrator가 서비스 컨텍스트에서 가져 오는 것이 방송에서 작동하지 않을 수도 있습니다. (컨텍스트 컨텍스트에서) onReceive에서 다시 가져 오려고 시도하십시오. – njzk2

    +0

    @ njzk2 - 확인했는데 그럴 것 같지 않습니다. 진동이 "패턴"으로 멈추는 무언가가 있습니다. 단지 올바르게 다시 시작할 수없는 것 같습니다. 단지 "시스템 진동"만이 가능합니다. 내 편집을 보아라. – Koger

    답변

    0

    그 이상한 행동을 일으키는 원인이 무엇인지 또는 다른 전화 모델에서 발생하는지는 확실하지 않지만 아래의 코드는 내 누구나이 문제가있어 더 나은 해결책이 제시되지 않으면 화면을 켜고 끈 후에 작동하는 간단한 MyVibrator 클래스.

    public class MyVibrator { 
    
    Vibrator mVibrator; 
    Handler mHandler = new Handler(); 
    
    boolean mIsVibrateOn; 
    private long mVibrateOnLength; 
    private long mVibrateOffLength; 
    
    private Runnable mVibrateRunnable = new Runnable() { 
        @Override 
        public void run() { 
         if (mIsVibrateOn) { 
          mVibrator.vibrate(mVibrateOnLength); 
          postVibrateRunnable(mVibrateOnLength + mVibrateOffLength); 
         } else { 
          mVibrator.cancel(); 
         } 
        } 
    }; 
    
    public MyVibrator(Context context) { 
        mVibrator = (Vibrator) context 
          .getSystemService(Context.VIBRATOR_SERVICE); 
    } 
    
    public void vibrate(long vibrateOn, long vibrateOff) { 
        mVibrateOnLength = vibrateOn; 
        mVibrateOffLength = vibrateOff; 
        mIsVibrateOn = true; 
        postVibrateRunnable(0); 
    } 
    
    public void stopVibrating() { 
        mIsVibrateOn = false; 
        mHandler.removeCallbacks(mVibrateRunnable); 
        mVibrator.cancel(); 
    } 
    
    private void postVibrateRunnable(long delay) { 
        mHandler.removeCallbacks(mVibrateRunnable); 
        mHandler.postDelayed(mVibrateRunnable, delay); 
    } 
    

    }

    아직 철저하게 테스트 할 수있다,하지만 지금까지 잘 작동하는 것 같군. 일부 작업을하면 더 긴 패턴을 사용하도록 쉽게 변경 될 수 있습니다.