You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用buildAsync()创建MediaController始终无返回值问题排查

MediaController异步构建回调未触发问题排查与调试

问题场景

在Capacitor插件的Java代码中,RemoteStreamerService继承自MediaSessionService且已确认处于运行状态,但调用MediaController.Builder.buildAsync()后,ListenableFuture的监听器从未触发,无报错日志,Future始终处于挂起状态。

可能的原因

  • SessionToken与MediaSession不匹配:
    需确认RemoteStreamerService中创建的MediaSession与Controller使用的SessionToken对应一致。若Service运行在独立进程,需在Manifest中设置android:exported="true",否则跨进程无法建立连接。
  • MediaSession未激活:
    RemoteStreamerService中必须调用mediaSession.setActive(true),未激活的Session会导致Controller连接请求一直等待,即使Service已运行。
  • MediaSessionService核心回调未实现:
    必须正确实现onGetSession()方法并返回已初始化的MediaSession实例,否则Controller无法获取到Session:
    @Override
    public MediaSession onGetSession() {
        return mediaSession; // 返回已创建并激活的MediaSession
    }
    
  • 进程隔离与权限问题:
    若RemoteStreamerService配置了独立进程(android:process属性),需确保Manifest中添加了必要的权限或Intent Filter,避免Binder通信被系统阻断。
  • Executor线程阻塞:
    虽然使用了ContextCompat.getMainExecutor(),但如果主线程被阻塞,或者initPlayer()在子线程调用时主线程无响应,监听器无法执行。

调试方案

  • 验证MediaSession状态与回调:
    在RemoteStreamerService中添加日志,确认Session已创建、激活,且onGetSession()被调用:
    @Override
    public void onCreate() {
        super.onCreate();
        mediaSession = new MediaSession.Builder(this, "REMOTE_STREAMER")
                .setSessionActivity(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_IMMUTABLE))
                .build();
        mediaSession.setActive(true);
        Log.d("stream-service", "MediaSession active: " + mediaSession.isActive());
    }
    
    @Override
    public MediaSession onGetSession() {
        Log.d("stream-service", "onGetSession invoked");
        return mediaSession;
    }
    
    若onGetSession()未被打印,说明SessionToken无法匹配到目标Session,需检查ComponentName或进程配置。
  • 同步构建捕获异常:
    替换异步构建为同步build(),直接捕获异常,定位隐藏错误:
    try {
        player = new MediaController.Builder(getContext(), sessionToken).build();
        Log.d("stream", "同步构建MediaController成功");
    } catch (Exception e) {
        Log.e("stream", "同步构建失败", e);
    }
    
    异步构建的异常会被封装在Future中,同步调用可直接暴露问题。
  • 检查Manifest配置:
    确认Service的Manifest声明正确,需包含MediaBrowserService的Intent Filter:
    <service
        android:name=".RemoteStreamerService"
        android:exported="true"
        android:foregroundServiceType="mediaPlayback">
        <intent-filter>
            <action android:name="android.media.browse.MediaBrowserService" />
        </intent-filter>
    </service>
    
  • 验证SessionToken有效性:
    在initPlayer()中添加日志,检查SessionToken的合法性:
    Log.d("stream", "SessionToken组件: " + sessionToken.getComponentName().getClassName());
    Log.d("stream", "SessionToken有效: " + sessionToken.isValid());
    
    若isValid()返回false,说明ComponentName拼写错误或包名不匹配。
  • 排查线程状态:
    打印当前线程信息,确认initPlayer()的调用线程:
    Log.d("stream", "initPlayer调用线程: " + Thread.currentThread().getName());
    
    若在子线程调用,可尝试替换Executor为Executors.newSingleThreadExecutor()测试,看监听器是否触发。

内容的提问来源于stack exchange,提问作者jiggy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 17:05:10