Почему мои уведомления иногда молчат с рингтоном с SD-карты? - PullRequest
3 голосов
/ 28 июля 2010

Я использую уведомления в своем простом приложении для таймера (ранняя стадия тестирования) и обнаружил, что, возможно, в 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 между успехом и отсутствующим звуком. В попытке обойти проблемы со сном, если они есть, я временно добавил (в this commit ) этот 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 Ones под управлением Android 2.2 (Froyo). Он не был замечен на 2.1, но не был использован в этой версии, и не был замечен на 1.6 на G1, где он использовался в течение нескольких месяцев. Это было замечено в любое время дня, со звуками только с SD-карты и из внутренней памяти . По состоянию на январь 2011 года на Android 2.2.1 это происходит только с рингтонами с SD-карты. Я также немного искал Android bug tracker , но безрезультатно.

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

1 Ответ

1 голос
/ 29 ноября 2010

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...