Android TV-Exoplayer控件显示在模拟器上,而不显示在电视上

时间:2020-09-21 06:34:49

标签: android-tv exoplayer2.x

我是一个相对初学者。我创建了一个简单的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
    }
}

1 个答案:

答案 0 :(得分:0)

我不确定为什么会出现问题(甚至是正常现象),但是如果有人遇到类似的问题,我将以下内容添加到PlayerActivity类中,现在可以使用了。

card-background-color   background-basic-color-1    #ffffff 
card-text-color         text-basic-color            #222b45