Я использую уведомления в своем простом приложении таймера (ранний этап тестирования) и обнаружил, что от 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 для приложения.