首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何访问MediaBrowserServiceCompat服务实例?

如何访问MediaBrowserServiceCompat服务实例?
EN

Stack Overflow用户
提问于 2018-04-30 12:16:54
回答 2查看 3.3K关注 0票数 6

令人惊讶的是,我很难获得从MediaBrowserServiceCompat派生的服务实例。

对于典型的服务,要实现这一点,需要使用本地绑定器。

代码语言:javascript
复制
class MyService extends MediaBrowserServiceCompat {
  class MyBinder extends Binder {
    public MyService getService() {
      return MyService.this;
    }

  private final MyBinder binder = new MyBinder();

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

  public void doMagic() { // <-- How to call this from activity?
    // ...
  }
}

// At the activity, for example, this binder is retrieved through 
// `onServiceConnected()`, typecast to `MyBinder` and thus 
// `getService()` gets us the service instance.

但是,这并不适用于从MediaBrowserServiceCompat派生的服务。

当我试图提供本地绑定(如上面所示)时,服务崩溃了,因为MediaBrowserServiceCompat希望它自己的自定义绑定器具有额外的功能。这是崩溃堆栈跟踪

代码语言:javascript
复制
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
    at android.os.Binder.queryLocalInterface(Binder.java:254)
    at android.service.media.IMediaBrowserService$Stub.asInterface(IMediaBrowserService.java:31)
    at android.media.browse.MediaBrowser$MediaServiceConnection.onServiceConnected(MediaBrowser.java:793)
    at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1223)
    at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1240)
    at android.os.Handler.handleCallback(Handler.java:746)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5443)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

我试着从MediaBrowserServiceCompat超类包装活页夹,就像下面所示,但是它仍然不能工作。

代码语言:javascript
复制
class MyService extends MediaBrowserServiceCompat {
  class MyBinder extends Binder {
    public MyService getService() {
      return MyService.this;
    }

  private final WrappingBinder<MyService> binder;

  @Override
  public IBinder onBind(Intent intent) {
    if (binder == null) {
      binder = new WrappingBinder(super.onBind(intent));
    }

    return binder;
  }

  public void doMagic() { // <-- How to call this from activity or elsewhere?
    // ...
  }
}

因此,想知道访问MediaBrowserServiceCompat服务实例的方法是什么?

要明确的是,播放功能对我来说很好。问题是如何获得对服务的引用,这样我就可以对该服务上的自定义公共方法进行调用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-30 16:25:53

正如您所发现的,MediaBrowserServiceCompat已经是一个绑定服务-您不能也不应该覆盖onBind()

相反,您必须按照MediaBrowserServiceCompatMediaBrowserCompat连接到您的文献资料。连接之后,可以通过以下方式触发自定义方法,如doMagic

  1. 从您的MediaControllerCompat实例创建一个MediaBrowserCompat,遵循文献资料
  2. 调用sendCommand,传入唯一标识命令(例如,doMagic)的command字符串、希望传递给该方法的任何参数,如果需要返回值,则传入ResultReceiver
  3. 在向MediaSessionCompat.Callback注册的MediaBrowserServiceCompat中,重写onCommand()并处理命令(例如,通过调用doMagic)。

这篇博客文章中提供了这种方法的一个示例

票数 13
EN

Stack Overflow用户

发布于 2019-01-05 13:55:54

您可以尝试此解决方案(对于快速修复,不推荐):

代码语言:javascript
复制
private final MyBinder myBinder = new MyBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
    if (intent.getBooleanExtra("is_binding", false)) {
        return myBinder;
    }
    return super.onBind(intent);
}

// Bind service in your activity:

Intent intent = new Intent(this, MyPlaybackService.class);
intent.putExtra("is_binding", true);

bindService(intent, this, Context.BIND_AUTO_CREATE);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50100364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档