Воспроизведение рингтона из действия резко останавливается - PullRequest
5 голосов
/ 06 декабря 2011

В моем приложении для Android я пытаюсь воспроизвести текущую мелодию звонка по умолчанию при создании своей активности. Но рингтон не просто воспроизводится полностью и каждый раз останавливается на произвольной длине.

Код настолько прост, насколько это возможно, любая помощь будет оценена.

Uri currentUri = RingtoneManager.getActualDefaultRingtoneUri(this.context, 
    RingtoneManager.TYPE_RINGTONE);
Ringtone ringtone = RingtoneManager.getRingtone(this.context,currentUri);
if (ringtone != null){
    ringtone.play();
}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2014

У меня была такая же проблема, и выше ответ не работал в моем случае.

Но рингтон работал нормально в уведомлении, поэтому я сделал уведомление (без содержимого)

Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        NotificationCompat.Builder mBuilder;
        mBuilder =
                new NotificationCompat.Builder(this)
                .setSound(alarmSound)
                .setVibrate(new long[]{1000,1000});

        mNotificationManager.notify(ANY_INT_WILL_DO_HERE, mBuilder.build());

Это сработало в моем случае. Я надеюсь, что это работает и для вас.

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

0 голосов
/ 12 декабря 2013

Я использую TYPE_NOTIFICATION, но, судя по всему, мой код был более или менее точно таким же.

Я обнаружил, что воспроизведение звука внутри нового обработчика помогло в моем случае:

        Uri currentUri = RingtoneManager.getActualDefaultRingtoneUri(
                this.context, RingtoneManager.TYPE_RINGTONE);
        final Ringtone ringtone = RingtoneManager.getRingtone(this.context,
                currentUri);
        if (ringtone != null) {
            new Handler().post(new Runnable() {

                @Override
                public void run() {
                    ringtone.play();
                }
            });
        }

Почему это решило проблему?

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

При использовании нового обработчика воспроизведение ставится в очередь до окончания других операций, в результате чего звук не прерывается.

По крайней мере, таково мое восприятие: Что именно делает метод post?

...