我是一个相对初学者。我创建了一个简单的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/)-但是它很旧,无法使用。而且我不确定是否必须实现倾斜控制,还是可以在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
}
}
答案 0 :(得分:0)
我不确定为什么会出现问题(甚至是正常现象),但是如果有人遇到类似的问题,我将以下内容添加到PlayerActivity类中,现在可以使用了。
card-background-color background-basic-color-1 #ffffff
card-text-color text-basic-color #222b45