Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/185.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何访问MediaBrowserServiceCompat服务的实例?_Android_Android Service_Android Mediaplayer_Android Support Library_Android Service Binding - Fatal编程技术网

Android 如何访问MediaBrowserServiceCompat服务的实例?

Android 如何访问MediaBrowserServiceCompat服务的实例?,android,android-service,android-mediaplayer,android-support-library,android-service-binding,Android,Android Service,Android Mediaplayer,Android Support Library,Android Service Binding,令人惊讶的是,我很难获得一个源于mediabrowservicecompat的服务实例 对于典型的服务,要实现这一点,需要使用本地活页夹 class MyService extends MediaBrowserServiceCompat { class MyBinder extends Binder { public MyService getService() { return MyService.this; } private final MyBinde

令人惊讶的是,我很难获得一个源于
mediabrowservicecompat
的服务实例

对于典型的服务,要实现这一点,需要使用本地活页夹

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.

我尝试从
mediabrowservicecompat
super类包装活页夹,如下所示,但仍然不起作用

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?
    // ...
  }
}
class MyService扩展了MediaBrowserServiceCompat{
类MyBinder扩展了Binder{
公共MyService getService(){
返回MyService.this;
}
专用最终包装装订机;
@凌驾
公共IBinder onBind(意向){
如果(活页夹==null){
绑定器=新的包装器(super.onBind(intent));
}
返回活页夹;
}

public void doMagic(){//正如您所发现的,
mediabrowservicecompat
已经是绑定服务-您不能也不应该覆盖
onBind()


相反,您必须按照使用
MediaBrowserCompat
连接到您的
MediaBrowserServiceCompat
。连接后,您可以通过以下方式触发自定义方法,如
doMagic

  • MediaBrowserCompat
    实例创建一个
    MediaControllerCompat
    ,如下所示
  • 召唤 ,传递唯一标识您的命令的
    命令
    字符串(例如,
    doMagic
    ),希望传递给方法的任何参数,以及
    ResultReceiver
    (如果需要返回值)

  • 在向您的
    MediaBrowserServiceCompat
    注册的
    MediaSessionCompat.Callback中,重写并处理该命令(例如,通过调用
    doMagic
  • 此方法的一个示例在

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


    MediaBrowserServiceCompat
    是一项服务。若要创建一个
    类,MyService将扩展MediaBrowserServiceCompat
    遵循。这可能会有所帮助。播放功能对我来说很好。问题是如何获取对该服务的引用,以便我可以调用该服务上的自定义公共方法。Dear ianhanniballake,如何从MediaBrowserServiceCompat通知UI更新,在我的情况下,播放器文件需要在播放前下载到本地,如何通知活动显示/隐藏加载。Thanks@hai-听起来你应该看看
    EXTRA\u DOWNLOAD\u PROGRESS
    常量及其相关方法。你也可以从您通过MediaBrowserServiceCompat上的
    sendSessionEvent
    API向所有连接的MediaBrowserCompat提供的服务非常感谢,这正是我想要的
    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?
        // ...
      }
    }
    
    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);