如何访问 MediaBrowserServiceCompat 服务的实例?

2023-11-25

令人惊讶的是,我正在努力获取源自以下内容的服务实例:MediaBrowserServiceCompat.

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

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期望有自己的自定义活页夹并具有附加功能。这是崩溃堆栈跟踪

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超级类,如下所示,但仍然行不通。

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 服务实例的方法是什么?

需要明确的是,播放功能对我来说运行良好。问题是如何获取对该服务的引用,以便我可以调用该服务上的自定义公共方法。


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

相反,您必须连接到您的MediaBrowserServiceCompat with a MediaBrowserCompat as per 文档。连接后,您可以触发自定义方法,例如doMagic by:

  1. 创建一个MediaControllerCompat从你的MediaBrowserCompat实例,如下文档
  2. Call sendCommand,传入一个command唯一标识您的命令的字符串(例如,doMagic)、您希望传递给该方法的任何参数以及ResultReceiver如果你想要一个返回值。
  3. In the MediaSessionCompat.Callback注册到您的MediaBrowserServiceCompat, 覆盖onCommand()并处理命令(例如,通过调用doMagic).

这种方法的一个例子在这篇博文

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何访问 MediaBrowserServiceCompat 服务的实例? 的相关文章