2013-06-21 2 views
0

Я хочу удалить уведомление из ящика после его отображения в виде тикера и после воспроизведения звука (и вибрации тоже).Извлечение уведомлений из ящика после воспроизведения звука и отображение тикера

У меня есть следующий код в моем приложении

NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context) 
      .setSmallIcon(R.drawable.ic_action_calendar_themedark) 
      .setLights(0xffffffff, 500, 1000) 
      .setAutoCancel(true) 
      .setTicker(context.getString(R.string.tewstgfd)); 

    if (vibratePattern != null) { 
     mBuilder.setVibrate(vibratePattern); 
    } 

    if (soundUri != null) { 
     mBuilder.setSound(soundUri, AudioManager.STREAM_NOTIFICATION); 
    } 

    addPriorityHigh(mBuilder); 

    NotificationManager mNotificationManager = 
     (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    mNotificationManager.notify(R.string.e_notif_rest_id, mBuilder.build()); 
    mNotificationManager.cancel(R.string.e_notif_rest_id); 

Обратите внимание на последние 2 строки: создать уведомление и немедленно удалить его. Однако это также останавливает звук уведомления и останавливает вибрацию. Поэтому отображается только тикер, но это совсем не то, чего я хочу. Если удалить последнюю строку (mNotificationManager.cancel (R.string.e_notif_rest_id), то уведомление остается в ящике, но это то, что я хочу, чтобы избежать.

Что я упускаю?

+0

Просто жду, прежде чем отменить уведомление, как предполагает forgivegod, будет работать, конечно. Но я думаю, что это создает очень плохой опыт пользователя и не должно быть сделано. Используйте уведомление тостов, если вы этого не сделаете имеют основания для создания (и сохранения) полного уведомления. –

+0

Даршан, да, это именно то, что у меня есть сейчас. просто хотел заменить 1) замок блокировки (для мигания экрана), 2) музыкальный проигрыватель (для звука) и 3) услуга вибрации (для вибрации) с одним простым уведомлением, которое в основном может сделать все это. BUt кажется, что я не могу. –

ответ

1

Попробуйте отсрочить .cancel

final NotificationManager mNotificationManager = 
.....rest of your code... 


/// might need to do this part in a background thread -- start 
MediaPlayer mp = new MediaPlayer(); 

AssetFileDescriptor d = context.getAssets().openFd(fileName); 
mp.reset(); 
mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength()); 
mp.prepare(); 
int duration = mp.getDuration(); 
mp.reset(); 
/// might need to do this part in a background thread -- end 


mNotificationManager.notify(R.string.e_notif_rest_id, mBuilder.build()); 
new Handler().postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     mNotificationManager.cancel(R.string.e_notif_rest_id); 
    } 
}, duration+200 /*+ 200ms*/); 
+0

Да, я знаю, что вы можете отменить это, но неясно, как долго он будет там. В вашем примере вы указали 30 секунд, но это может быть более короткое время, это зависит от продолжительности звука уведомления, что трудно оценить. –

+0

Получение длительности звукового файла довольно просто (см. Редактирование). – petey