Intereting Posts
Преобразование Xamarin.Forms.Color в цвет конкретной платформы OnActivityResult не работает? Android sdk main.out.xml ошибка синтаксического анализа? Как получить настройки разрешения приложения в android? Android.support.v4.app.FragmentManager и android.app.FragmentManager в ViewPager Android, как изменить настройки SSL-шифрования по умолчанию для WebView HTTPS IDEA 11 adb Ошибка ввода-вывода при попытке подключить отладчик, когда открываются 2 окна IDEA Как получить текущий выделенный фрагмент в FragmentTabHost Запустить Android-приложение дважды для работы, почему? Рисование квадратного макета внутри круга Как реализовать FM-передатчик в Android? Проблемы с базой 64 в Android Studio Как я могу ждать 10 секунд без блокировки пользовательского интерфейса приложения в android Перестроить, синхронизировать Gradle и Clean для всего одного модуля с Android Studio Android ProgressDialog: настройка пользовательского представления вместо сообщения – это работает?

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

У меня есть приложение для 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 .