Android 在服务中播放音频时片段中的 MediaController

Android MediaController in Fragment while audio is playing in Service

我有一个 Activity 使用片段来显示各种屏幕。其中一个屏幕用于播放音频文件。当用户选择要播放的音频文件时,我会启动一个服务并在该服务上播放音频,这样即使用户 returns 回到主屏幕,音频也会继续在后台播放。

我的问题是这样的。我如何在片段中使用 MediaController 来反映服务中发生的事情,这样我就不必重新发明 MediaController 的所有控件?

我可以在我的片段中创建 MediaController 并显示它,但是 mMediaController.setMediaPlayer(this);将控制器设置为我的片段,对吗?如何让它设置为我的服务?

让你的 Service 实施 MediaPlayerControl,例如...

public class MyMusicService extends Service
    implements MediaPlayerControl {

    ...

    // Override the various `MediaPLayerControl` methods
}

现在,为了让您的 Fragment 使用 MediaPlayerControl,它必须绑定到 Service。将以下内容添加到 Service...

private final IBinder mBinder = new LocalBinder();

public class LocalBinder extends Binder {
    public MyMusicService getService() {
        return MyMusicService.this;
    }
}

@Override
public IBinder onBind(Intent arg0) {
    return mBinder;
}

现在您需要在 Fragment 代码中添加绑定到 Service 的功能 -注意,我只使用Activity 但理论与 Fragment 相同。在您的 Fragment 代码中添加 ServiceConnection...

MyMusicService mService = null;
boolean mBound;

private ServiceConnection mConnection = new ServiceConnection() {
    public void onServiceConnected(ComponentName className, IBinder service) {
        LocalBinder binder = (LocalBinder) service;
        mService = binder.getService();
        mBound = true;
    }

    public void onServiceDisconnected(ComponentName className) {
        mService = null;
        mBound = false;
    }
};

您可以在 onResume() 中绑定到您的 Service 并在 FragmentonPause() 中解除绑定,如果您将以下内容添加到您的 Fragment您可以将 MediaController 设置为 Service...

public void showMediaControllerHere() {
    if (mBound){
        controller.setMediaPlayer(mService);
        controller.setEnabled(true);
        controller.show();
    }
}