Потоковое аудио с помощью службы

Пожалуйста, взгляните на мой simple three-methods Service class, который транслирует аудио, и воспроизведите его напрямую.

public class StreamService extends Service {

    private static final String TAG = "MyService";
    String url;
    MediaPlayer mp;

    @Override
    public void onCreate() {
        Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onCreate");

        mp = new MediaPlayer();
        mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onDestroy");

        mp.stop();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
        Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show();
        Log.d(TAG, "onStart");

        url = intent.getExtras().getString("url");
        try {
            mp.setDataSource(url);
            mp.prepare();
            mp.start();
        } catch(Exception e){}          
        return START_STICKY;
    }
}

В моей деятельности у меня есть две кнопки для воспроизведения/остановки медиафайла:

  • playButton выполнить это:

    Intent i = new Intent(this, StreamService.class);
    i.putExtra("my_mp3_url_string");
    startService(i);
    
  • stopButton выполнить это:

    stopService(new Intent(this, StreamService.class));
    

Теперь у меня есть несколько вопросов:

  1. как я могу реализовать pauseButton? Я хочу приостановить воспроизведение мультимедиа в Службе
  2. Правилен ли мой способ воспроизведения/остановки мультимедиа/сервиса? Есть ли лучший способ?
  3. Как я могу (периодически) обновлять пользовательский интерфейс своей деятельности из моей службы? мне нужно что-то добавить?

person iTurki    schedule 21.01.2012    source источник


Ответы (1)


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

Для этого (и для возможности приостановки) вам необходимо выполнить привязку к Службе после ее запуска. С привязанной службой вы сможете совершать к ней вызовы, такие как пауза, воспроизведение, остановка и т. д.

Вот несколько ссылок, которые должны помочь вам с тем, что вы ищете:

person Aldryd    schedule 21.01.2012
comment
Большое спасибо. Хотя я все еще не могу сделать Сервис для обновления пользовательского интерфейса Activity, но я считаю, что вы указали мне правильное направление. Еще раз спасибо :) - person iTurki; 23.01.2012
comment
@iturki: я работаю над похожим приложением. Можете ли вы поделиться своим опытом управления сервисом плеера и обновлением пользовательского интерфейса в Activity? - person Mehul Joisar; 26.08.2013
comment
Я думаю, что есть несколько вариантов, которые вы могли бы использовать для обновления пользовательского интерфейса в зависимости от изменений в сервисе плеера. 1. Зарегистрируйте прослушиватель при привязке к службе проигрывателя с классом, который вы создаете с обратными вызовами, которые предоставляют вам обновления об изменениях в службе проигрывателя. 2. (вероятно, самый простой способ) Используйте трансляции из службы проигрывателя, чтобы указывать обновления и прослушивать эти трансляции в своем пользовательском интерфейсе. - person Aldryd; 27.08.2013
comment
Это правда, что то, что вы сказали, не означает, что служба должна оставаться навсегда.. Но, если я могу спросить вашего мнения, как вы можете применить это к этому делу? Я имею в виду, что если онлайн-трансляция не прервется или пользователь не захочет остановиться, чтобы послушать радио, сервису не будет конца. Верно? @Олдрид - person yat0; 03.08.2015