【发布时间】:2021-01-07 06:03:18
【问题描述】:
我是一个相对初学者。我创建了一个简单的 exoplayer 活动来在 Android TV 上播放 HLS 流。它可以正常加载和播放,当控件显示时,我可以暂停、播放、倒带、快进。在 android studio 模拟器 (Android TV API 28) 上,一旦控件隐藏起来,我可以单击模拟器并取消隐藏控件,所以一切都按预期工作。
在我的设备 (Nvidia Shield) 上,一切正常,直到控件隐藏。单击遥控器不会再次显示播放控件。我一直在寻找解决方案,我发现一些关于胶水等的提及,但这些页面提供了部分解决方案。我还没有找到任何关于如何在 Android TV 上实现 exoplayer 的教程。而且由于我是初学者,我真的可以使用指南。我能找到的所有指南都是关于在 Android 中实现 exoplayer 的——这就是我得到以下内容的方式。我发现唯一对我有意义的指南是这个 (https://rileymacdonald.ca/2017/09/21/android-tv-how-to-add-leanback-media-controls-to-google-exoplayer/) - 但它很旧而且不起作用。而且我不确定我是否必须实现leanback控件,或者只能使用exoplayer中的那些?非常感谢更新指南或帮助我解决单击遥控器时控件未重新显示的问题。
清单
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.exoplayertest">
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"
android:banner="@drawable/tv">
<activity android:name=".MainActivity"
android:configChanges="keyboard|keyboardHidden|navigation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/flRoot"
android:focusable="true"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
<com.google.android.exoplayer2.ui.PlayerView
android:id="@+id/playerView"
android:focusable="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"/>
</com.google.android.exoplayer2.ui.PlayerView>
</FrameLayout>
MainActivity.kt
class MainActivity : Activity() {
private var mPlayer: SimpleExoPlayer? = null
private val hlsUrl = "https://9now-livestreams.akamaized.net/hls/live/2010628/rush-mel/master.m3u8"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
private fun initPlayer() {
mPlayer = SimpleExoPlayer.Builder(this).build()
// Bind the player to the view.
playerView.player = mPlayer
mPlayer!!.playWhenReady = true
//mPlayer!!.seekTo(playbackPosition)
mPlayer!!.prepare(buildMediaSource(), false, false)
}
override fun onStart() {
super.onStart()
initPlayer()
}
override fun onResume() {
super.onResume()
hideSystemUi()
if (mPlayer == null) {
initPlayer()
}
}
override fun onPause() {
super.onPause()
}
override fun onStop() {
super.onStop()
releasePlayer()
}
@SuppressLint("InlinedApi")
private fun hideSystemUi() {
playerView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LOW_PROFILE
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)
}
private fun releasePlayer() {
if (mPlayer == null) {
return
}
mPlayer!!.release()
mPlayer = null
}
private fun buildMediaSource(): MediaSource {
val userAgent =
Util.getUserAgent(playerView.context, playerView.context.getString(R.string.app_name))
val dataSourceFactory = DefaultHttpDataSourceFactory(userAgent)
val hlsMediaSource =
HlsMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse(hlsUrl))
return hlsMediaSource
}
}
【问题讨论】: