2012-05-15 3 views
0

Я использую услугу, которая напоминает пользователя в случайных интервалах. Эта служба запускается с помощью Activity и работает в фоновом режиме как служба.Воспроизведение звука, когда телефон спит

Задача, с которой я столкнулся, заключается в том, когда пользователь ставит телефон в сон (пустой экран), в некоторых случаях звук просто не воспроизводится. Время закончилось, но звук не будет воспроизводиться либо вовремя, либо воспроизводится, когда пользователь просыпается по телефону.

Вот код /** * начинает новый поток, который проверяет каждую секунду, сколько времени * истекшее и если точка пришло время воспроизведения звука. * По прошествии времени он получает следующее время звонка и продолжает * до тех пор, пока пользователь не отключится */ private void runCheck() { Log.i (тег, «start runCheck»);

Thread thread = new Thread() { 
     public void run() { 

      Log.i(tag, "starting LogoTimerThread"); 
      while (vRunningFlag) { 

       try { 

        // update the notification 
        makeNotification(); 

        Log.v(tag, 
          "Next Ring in : [" 
            + helper.TimeCalculator 
              .duration2_hh_MM_SS((vTimerNextRing - System 
                .currentTimeMillis())/1000) 
            + " sec.]"); 

        // check if time has run out 
        if (vTimerNextRing < System.currentTimeMillis()) { 
         // reset the timer 
         setNextRingTime(); 
         // update the screen 
         makeNotification(); 
         // play the sound 
         playLTimerSound(); 
        } 

        sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
      Log.i(tag, "finished LogoTimerThread"); 
     } 
    }; 

    thread.start(); 
} 

Вся служба работает как удаленный сервис, который установлен на переднем плане, поэтому уведомление напоминает пользователю о службе, и он может остановить это таким образом.

Как только я прокомментирую playLTimerSound(), таймер просто начнет отсчет. Каким-то образом поток прекращается, играя звук.

Здесь IST этой функции, а также:

public void playLTimerSound() { 
    Log.i(tag, "playLogoTimerSound - volume:" + vVolume); 
    MediaPlayer mp = MediaPlayer.create(this, R.raw.enterprise); 
    mp.setVolume(2.0f, 2.0f); 
    mp.start(); 
    mp.setOnCompletionListener(new OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      // TODO Auto-generated method stub 
      mp.release(); 
     } 
    }); 
} 

Извините за форматирование здесь, вы можете иметь некоторые советы по этому вопросу, а также ;-)

ответ

0

не aquire SCREEN_DIM_WAKE_LOCK в вас сценарии?

@Override 
protected void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 




PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "App"); 
wl.acquire(); 

} 
+0

Должен ли я приобрести замок прямо перед воспроизведением звука или при создании? Я не знаком с вакелоками. – user929995