如何将服务内的 ExoPlayer 与活动内的 ExoPlayerView 连接起来?

Gak*_*ket 5 android pass-by-reference exoplayer

我想将“全屏”按钮添加到 Google 的标准 SimpleExoPlayer 实现中。我添加了 ImageButton,到目前为止一切正常。

然后我决定全屏将以下一种方式工作:按下按钮后,我用全屏 SimpleExoPlayerView 打开新活动,传递视频 uri 和当前位置,初始化播放器并寻找给定位置。它有效,但播放器重新初始化需要 1-3 秒,具体取决于不想要的设备。

现在我想在意图服务中拥有一个播放器实例,只需将现有播放器重新附加到任何想要显示它的视图(预览或全屏视图),如下所示:

mPlayerView.setPlayer(mPlayer);
Run Code Online (Sandbox Code Playgroud)

问题是服务将拥有播放器,而活动将拥有视图。他们中的任何一个都不能同时连接播放器进行查看。作为一种解决方法,我考虑使服务类可能具有到播放器的静态链接,因此活动将能够通过静态引用获取它。但这似乎是一些代码异味,我不知道线程之间的通信是否会出现问题。

那么,我如何将播放器从服务(不是 Serializable 或 Parcelable)传递给 Activity 或者如何将播放器视图传递给服务?

Sou*_*ugh -2

exoPlayer 处理全屏足够好 - 尝试更改 playerView 的布局参数以匹配旋转或按下按钮时的屏幕。

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    int width;
    int height;

    View decorView = getWindow().getDecorView();
    int uiOptions;

    if(newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
        Resources r = getResources();
        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, r.getDisplayMetrics());
        width = CoordinatorLayout.LayoutParams.MATCH_PARENT;
        height = (int)px;
        uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;
    } else {
        uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    }

    decorView.setSystemUiVisibility(uiOptions);
    final CoordinatorLayout.LayoutParams lp = new CoordinatorLayout.LayoutParams(width, height);
    mAppBar.setLayoutParams(lp);
}
Run Code Online (Sandbox Code Playgroud)

另外,不要忘记将其添加到您的活动清单中以防止活动重新加载:

android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|smallestScreenSize|uiMode"
Run Code Online (Sandbox Code Playgroud)

  • 这并不能回答问题。问题是“如何将玩家从服务传递到活动,或者如何将玩家视图传递到服务?”。 (3认同)