Как остановить предыдущий рингтон? - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь написать небольшое приложение android для моего сына. Идея состоит в том, чтобы заставить рингтон начать играть по нажатию кнопки, и это следует остановить, нажав на другую кнопку. Что-то вроде нажатия кнопки, чтобы начать вызов, и другой кнопки, чтобы ответить на него. Мне удается заставить первую кнопку звонить, используя следующий код:

 CallLukas.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Uri notification = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
            MediaPlayer mp = MediaPlayer.create(getApplicationContext(), notification);
            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mp) {
                    mp.start();
                }
            });
        }
    });

Однако вторая кнопка для остановки мелодии звонка не работает, как предполагалось. Я использую следующий код:

Incoming.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(mp.isPlaying()) {
                mp.stop();
                mp.release();
            }
        }
    });

Останавливает мелодию звонка, но в то же время заставляет приложение обрабатывать sh. Как правильно остановить ранее активированный рингтон? Спасибо тебе ...

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Решением моей проблемы было создание MediaPlayer в качестве услуги. Я создал новый класс Java для расширения класса обслуживания. Вот код для этого:

public class RingtoneService extends Service {
private MediaPlayer mp;

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    mp = MediaPlayer.create(this, Settings.System.DEFAULT_RINGTONE_URI);
    mp.setLooping(true);
    mp.start();
    return START_STICKY;
}

@Override
public void onDestroy() {
    super.onDestroy();
    mp.stop();
}
}

Затем я обновил свой класс MainActivity следующим кодом:

CallLukas.setOnClickListener(this);
Incoming.setOnClickListener(this);

 @Override
public void onClick(View v) {
    if (v == CallLukas){
        startService(new Intent(this, RingtoneService.class));

    }else if (v == Incoming) {
        stopService(new Intent(this, RingtoneService.class));

    }
}

Код в основном устанавливает OnClickListener на мои кнопки и запускает службу если щелкнуть один из них и остановить службу, если щелкнуть другой.

Последние шаги заключаются в добавлении новой созданной службы в файл AndroidManifest. Его необходимо добавить внутрь тега <application>.

<application        
    <service android:name=".RingtoneService"></service>        
</application>

Полную инструкцию по реализации этого можно найти здесь: https://www.youtube.com/watch?v=p2ffzsCqrs8&t=315s

1 голос
/ 14 апреля 2020

Этот ответ должен вам помочь.

Мне кажется, проблема в том, что вы создаете несколько объектов MediaPlayer. Также попробуйте использовать .reset() вместо. stop().

...