gpt4 book ai didi

android - 如何访问 MediaBrowserServiceCompat 服务实例?

转载 作者:行者123 更新时间:2023-11-29 14:23:48 29 4
gpt4 key购买 nike

我出乎意料地努力获取派生自 MediaBrowserServiceCompat 的服务实例。

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

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 派生的服务。

当我尝试提供本地 Binder 时,如上所示,服务崩溃,因为 MediaBrowserServiceCompat 需要它自己的具有附加功能的自定义 Binder 。这是崩溃堆栈跟踪

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 父类(super class)包装 Binder ,如下所示,但仍然无法正常工作。

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

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

最佳答案

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

相反,您必须根据 the documentation 使用 MediaBrowserCompat 连接到您的 MediaBrowserServiceCompat .连接后,您可以通过以下方式触发自定义方法,例如 doMagic:

  1. 从您的 MediaBrowserCompat 实例创建一个 MediaControllerCompat,遵循 the documentation
  2. 打电话 sendCommand ,传递一个 command 字符串,它唯一地标识你的命令(比如,doMagic),你希望传递给方法的任何参数,以及一个 ResultReceiver 如果你想要一个返回值。
  3. 在使用您的 MediaBrowserServiceCompat 注册的 MediaSessionCompat.Callback 中,覆盖 onCommand()并处理命令(例如,通过调用 doMagic)。

this blog post 中提供了这种方法的示例

关于android - 如何访问 MediaBrowserServiceCompat 服务实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50100364/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com