Почему мои уведомления иногда молчат с рингтоном с SD-карты?

Я использую уведомления в своем простом приложении таймера (ранний этап тестирования) и обнаружил, что от 5% до 20% случаев, когда я запускал уведомление, звук не воспроизводился. Во всем остальном уведомление отображалось корректно, включая светодиодную вспышку, но молчало. Я подтвердил временными дополнительными строками журнала, что звуковые URI, которые я использую, разумны и фактически идентичны в случаях, которые работают, и случаях, когда это не так. Я резюмирую код настройки уведомления на случай, если я сделаю что-то монументально глупое:

// in a place called from onReceive()...
NotificationManager notifications = ...;
Notification n = new Notification(R.drawable.icon, text, nextMillis);
n.setLatestEventInfo(...);
n.flags = Notification.FLAG_NO_CLEAR | FLAG_SHOW_LIGHTS;
n.ledOnMS = 250; n.ledOffMS = 1250; n.ledARGB = 0xff2222ff;
n.audioStreamType = AudioManager.STREAM_ALARM;
n.sound = myUri;
notifications.notify((int)id, n);

Вот настоящая вещь. Единственный общий фактор, который я обнаружил, это то, что в проблемных случаях телефон спал (экран выключен более 30 секунд). Уведомление запрошено у BroadcastReceiver, пробужденный от Тревога RTC_WAKEUP. На ум приходит режим сбоя, который заключается в том, что устройство слишком рано возвращается в спящий режим, но ничто в logcat не указывает на это. На самом деле я не вижу никакой разницы в logcat между успехом и отсутствующим звуком. В попытке обойти проблемы со сном, если они есть, я добавил (в эту фиксацию) этот WakeLock временно:

+ PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Timer");
+ wl.acquire();
+ Log.d(TimerActivity.TAG, "Got wake lock");
  notifications.notify((int)id, n);
  Log.d(TimerActivity.TAG, "Notified!");
+ try {
+     Thread.sleep(1000);
+ } catch (InterruptedException e) { e.printStackTrace(); }
+ Log.d(TimerActivity.TAG, "Released wake lock");
+ wl.release();

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

Это было замечено на двух Nexus One под управлением Android 2.2 (Froyo). Его не было в версии 2.1, но в этой версии он почти не использовался, и его не было в версии 1.6 на G1, где он использовался в течение нескольких месяцев. Его видели в любое время суток, со звуком только с SD-карты и из внутренней памяти. По состоянию на январь 2011 г. на Android 2.2.1 это происходит только с мелодиями звонка с SD-карты. Я также искал Отслеживание ошибок Android, но безрезультатно.

Зарегистрировал это в системе отслеживания проблем моего приложения, но теперь кажется, что это может быть ошибка ОС . Я ничего не делаю, когда звук с SD-карты; это просто URI для приложения.


person Chris Boyle    schedule 28.07.2010    source источник


Ответы (1)


Это работает для меня:

notification.defaults = Notification.DEFAULT_SOUND
                      | Notification.DEFAULT_VIBRATE
                      | Notification.DEFAULT_LIGHTS;

Я не вижу этого в вашем коде.

Надеюсь, это сработает и для вас.

person Martín Schonaker    schedule 29.11.2010
comment
Выполнение точно привело бы к конфликту с конкретными настройками звука и света, которые я хотел использовать, но это натолкнуло меня на идею использовать вибрацию, что полезно. Возможно, даже если иногда пропадает звук, вибрации не будет. - person Chris Boyle; 03.12.2010