android - 使用服务流式传输音频

标签 android android-service android-mediaplayer

请看一下我的简单的三方法服务类,它可以流式传输音频并直接播放。

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;
    }
}

在我的 Activity 中,我有两个按钮来播放/停止媒体文件:

  • 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. 我如何(定期)从我的服务更新我的 Activity 的用户界面?我需要添加什么吗?

最佳答案

我建议不要使用服务的生命周期作为开始和停止播放的方式。使用这种方法意味着每次你想开始一个新的流时,代码会因为必须启动一个新的服务而变得更慢。您可以通过让相同的服务播放所有内容来节省一些时间。虽然这并不意味着它应该保留 running all the time .

要完成此操作(并能够暂停),您需要在服务启动后绑定(bind)到该服务。通过绑定(bind)服务,您将能够对其进行调用 - 例如暂停、播放、停止等。

这里有一些链接可以帮助您找到所需的内容:

关于android - 使用服务流式传输音频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954990/

相关文章:

java - 从主项目 pom 创建 jar

android - 如何在特定时间设置 View 可见?

android - setPlaybackParams 导致 IllegalStateException

android - 在 Android 中,是否保证 AbstractWindowedCursor.isBlob() 是正确的?

java - Android findFragmentByTag调试时返回null

android - whatsapp 是否在 android 上使用 c2dm aka GCM?

Android O - 在后台检测连接变化

android - 如何使用我的 Android 移动应用程序以分贝为单位设置音量?

android - 恢复 sqlite 数据库后,旧文件保持 Activity 状态??

android - 为 ACTION_BOOT_COMPLETED 动态注册 BroadcastReceiver 不起作用?