Intereting Posts
Ошибки, генерирующие подписанный apk для выпуска: Proguard config Что такое использование Android Super Class? Android Studio vs Visual Studio (разработка мобильных приложений для кросс-платформенных приложений) Невозможно импортировать проект Android в Eclipse – кнопка Finish ничего не делает Как удалить элементы из общего arraylist в Android (Java) Eclipse не генерирует файл apk для любого приложения, разработанного в нем? Исключение пустого конструктора в DeviceAdminReceiver Скрытие просмотров в RecyclerView Как я могу решить brut.androlib.AndrolibException Автоматическое форматирование кода в Android Studio Проблема с WifiManager.calculateSignalLevel (RSSI, 5) Получать сообщения GCM, даже когда приложение закрыто (слайд / отмахнулся) Динамически изменять счетчик PagerIndicator в ViewPager или PagerAdapter Как получить модель телефона Android, версию, информацию о sdk? Как установить высоту ширины изображения на основе размера экрана в gridview

Мелодия играет снова и снова (бесконечно циклически)

У меня есть приложение для Android, которое воспроизводит мелодию уведомления ( RingtoneManager.TYPE_NOTIFICATION ), когда определенные события отправляются в BroadcastReceiver.

Код, который воспроизводит мелодию звонка, в основном:

  onReceive(Context context, Intent intent) { ... Uri ringtoneUri = someFunctionToLookupAValidNotificationRingtoneUri(); ... Ringtone tone = RingtoneManager.getRingtone(context, uri); Log.v(TAG, "About to play ringtone"); tone.play(); } 

Каждый раз, когда этот код запускается, рингтон начинает играть снова и снова бесконечно. Иногда это случается, когда большое количество событий сгруппировано близко друг к другу, но это также случалось, когда приходило только одно событие. Сообщение журнала (и отладка) проверяет, что tone.play() происходит только один раз на событие, и Нет бесконечного потока событий.

Единственный способ остановить бесконечный цикл – убить мое приложение.

Это почти так, как если бы каждый так часто, Android забыл сбросить буфер вывода звука и, таким образом, он продолжает зацикливаться, играя все, что внутри.

Любые идеи по отладке и / или исправлению этой проблемы?

У меня была аналогичная проблема. Оказалось, что при воспроизведении мелодии звонка будет повторяться бесконечно до остановки, тогда как при воспроизведении звука уведомления он будет воспроизводиться только один раз. Поэтому я предполагаю, что разница в вашем случае заключается в том, была ли выбрана мелодия звонка или звук уведомления в someFunctionToLookupAValidNotificationRingtoneUri() . Поскольку вы не предоставляете код для someFunctionToLookupAValidNotificationRingtoneUri() , я не могу знать, что там происходит.

Выбор звука уведомления

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

  private void PickANotificationSound() { Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); // We want a notification sound picked. If we don't add this to the // intent, a ringtone is picked; this means that when it is played, // it will keep on playing until it is explicitly stopped. A // notification sound, however, plays only once. intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION); // Start the intent to pick a notification sound. The result will show // up later when onActivityResult() is called. startActivityForResult(intent, REQUESTCODE_NOTIFICATION_SOUND); } 

Где REQUESTCODE_NOTIFICATION_SOUND – это только локальная константа с любым именем и значением, идентифицирующая запрос:

  private static final int REQUESTCODE_NOTIFICATION_SOUND = 1; 

onActivityResult() обратного вызова onActivityResult() подобная этой, затем подберет URI звукового onActivityResult() уведомления и воспроизведет его:

  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUESTCODE_NOTIFICATION_SOUND) { try { if (resultCode == RESULT_OK) { Uri ringtoneUri = data.getParcelableExtra( RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (ringtoneUri != null) { PlayRingtoneOrNotificationSoundFromUri(ringtoneUri); } } } catch (Exception e) { e.printStackTrace(); } } else super.onActivityResult(requestCode, resultCode, data); } private void PlayRingtoneOrNotificationSoundFromUri(Uri ringtoneUri) { Ringtone ringtone = RingtoneManager.getRingtone( getApplicationContext(), ringtoneUri); if (ringtone != null) { ringtone.play(); } } 

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

Если бы мы заявили в намерении, что хотим выбрать рингтон, вот так:

  intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); 

Сборщик вернет рингтон, который будет играть бесконечно после ringtone.play() – до тех пор, пока не будет остановлен ringtone.stop() или приложение будет убито.

Два значения 'ringtone'

Обратите внимание, что терминология в Android API добавляет путаницу, поскольку слово «мелодия звонка» используется с двумя разными значениями ( см. Документацию RingtoneManager ):

  1. Любой звук, предназначенный для того, чтобы привлечь внимание пользователя, например звук, который нужно воспроизводить многократно, когда звонит телефон, звук уведомления или аналогичный звук. Это значение используется в имени RingtoneManager .

  2. Звук, который воспроизводится многократно, когда телефон звонит, в отличие от звука уведомления или аналогичного звука. Это значение используется в имени TYPE_RINGTONE в RingtoneManager.TYPE_RINGTONE .