Как воспроизводить рингтоны один раз используя MediaPlayer?

Ответить
Александр Козловский
Сообщения: 20
Зарегистрирован: 06 ноя 2015, 20:55

Как воспроизводить рингтоны один раз используя MediaPlayer?

Сообщение Александр Козловский » 10 мар 2018, 02:01

Всех приветствую. Подскажите пожалуйста,как воспроизводить рингтоны на смартфоне,используя класс MediaPlayer один раз. Просто когда я пытаюсь воспроизводить рингтоны,используя класс mediaplayer,большинство рингтонов воспроизводятся бесконечно,хоть я установил looping false. uri рингтонов я получаю,используя метод getCursor класса Ringtonemanager. Эти данные я сохраняю в мой класс track,которому в конструкторе в качестве первого параметра передаётся имя трека,в качестве второго uri,а в качестве третьего - id трека,который равен позиции,в которой находится курсор. Эти параметры,естественно,записываются в соответствующие поля соответствующего объекта класса track. Вот мой метод,который получает список всех рингтонов,которые есть в смартфоне.
public track[] getAllRingtones(Context context) {
RingtoneManager manager = new RingtoneManager(context);
manager.setType(RingtoneManager.TYPE_ALL);
Cursor cursor = manager.getCursor();
track[] tracks=new track[cursor.getCount()];
if (cursor.getCount() == 0 && !cursor.moveToFirst()) return null;
while (!cursor.isAfterLast() &&cursor.moveToNext()) {
tracks[cursor.getPosition()] =new track(cursor.getString(RingtoneManager.TITLE_COLUMN_INDEX),manager.getRingtoneUri(cursor.getPosition()),cursor.getPosition());
}
return tracks;
}
Но,как я уже писал,большинство рингтонов,полученных таким образом,воспроизводятся бесконечно,даже если установить объекту класса mediaplayer looping false. Я прочитал на stackoverflow,что для решения этой проблемы нужно использовать onSeekCompleteListener,но этот способ у меня работает только на киткате (api 19),а вот на samsung galaxy a3 2016 (api 24,android 7.0),большинство рингтонов также продолжают воспроизводиться бесконечно. Ещё на stackoverflow советовали выбрать тип рингтона уведомления,но мне нужно получить список всех рингтонов,установленных на телефоне. Ниже будет мой метод,создающий или пересоздающий объект класса mediaplayer. Если у кого-то возникнет вопрос,почему я решил для воспроизведения рингтона использовать класс mediaplayer,а не ringtone,я объясню. Во-первых мне нужно регулировать громкость рингтона,а во-вторых мне нужно в разных ситуациях играть его бесконечно,или только один раз (последнее,как я писал выше,как раз в основном не выходит).
public static void createMediaPlayer(Context c, Uri uri,boolean isLooping,float volume) {
mp=new MediaPlayer();
if(android.os.Build.VERSION.SDK_INT<=20)mp.setAudioStreamType(AudioManager.STREAM_ALARM);
else mp.setAudioAttributes(new AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_ALARM).setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION).setLegacyStreamType(AudioManager.STREAM_ALARM).build());
mp.setLooping(isLooping);
mp.setVolume(volume,volume);
mp.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() {
@Override
public void onSeekComplete(MediaPlayer mp) {
if(mp.isLooping()) {
mp.stop();
mp.release();
mp = null;
}
}
});
try {
mp.setDataSource(c,uri);
mp.prepare();
mp.start();
}
catch (IOException e) {
}
}
Направьте меня пожалуйста на путь истины,что я делаю не так,т.е почему большинство рингтонов на новом android повторяются,даже с использованием onSeekCompleteListener? Может тут можно обойтись и без MediaPlayer? Я знаю,что эта проблема решаема,ведь когда в каких-то приложениях выбираешь рингтон,он не играет бесконечно,как у меня,только как решить эту проблему,я не представляю. Я уже несколько дней "бьюсь" над ней,но у меня почти ничего не выходит. Заранее благодарю всех за помощь.

Ответить