如何获得对ExoPlayer的独家音频关注?

时间:2018-07-22 11:17:42

标签: android audio volume exoplayer

背景

我正在尝试在播放视频(使用ExoPlayer)的应用程序中进行操作,即使有电话,也要继续播放而不会受到干扰(包括音频)。

这意味着您将继续只听到视频的音频,而不听到铃声。

问题

无论我做什么,我都会听到铃声和视频的音频(甚至音量很小)。

我尝试过的

查看文档,我决定尝试一些标志和配置,并达到以下目标:

player!!.audioAttributes = AudioAttributes.Builder().setFlags(C.FLAG_AUDIBILITY_ENFORCED).setUsage(C.USAGE_NOTIFICATION_RINGTONE).setContentType(C.CONTENT_TYPE_SPEECH).build()

如我所写,这不能很好地工作。它的确与铃声在相同的流上播放,但不是唯一的。它与铃声一起播放,并且与之相比音量很小。

我通过首先了解什么是“音频焦点”(here)来实现此功能,所以我想在这里做同样的事情。我什至试图获得音频焦点,它说我知道了,但是它也不起作用。我的猜测是,ExoPlayer还是使用相同的API。

这是完整的代码:

成绩

...
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
    implementation 'com.android.support.constraint:constraint-layout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.google.android.exoplayer:exoplayer-core:2.8.1'
    implementation 'com.google.android.exoplayer:exoplayer-ui:2.8.1'
}

清单

...
<uses-permission android:name="android.permission.INTERNET"/>
...

activity_main.xml

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" tools:context=".MainActivity">

    <com.google.android.exoplayer2.ui.PlayerView
        android:id="@+id/playerView" android:layout_width="match_parent" android:layout_height="match_parent"
        app:resize_mode="fit"/>
</FrameLayout>

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private var player: SimpleExoPlayer? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onStart() {
        super.onStart()
        player = ExoPlayerFactory.newSimpleInstance(this, DefaultTrackSelector())
        player!!.audioAttributes = AudioAttributes.Builder().setFlags(C.FLAG_AUDIBILITY_ENFORCED).setUsage(C.USAGE_NOTIFICATION_RINGTONE).setContentType(C.CONTENT_TYPE_SPEECH).build()
        playerView.player = player
        val dataSourceFactory = DefaultDataSourceFactory(this, getUserAgent(this))
        val mediaSource = ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(Uri.parse("https://www.sample-videos.com/video/mkv/720/big_buck_bunny_720p_2mb.mkv"))
        player!!.prepare(mediaSource)
        playerView.useController = false
        player!!.playWhenReady = true
        player!!.repeatMode = Player.REPEAT_MODE_ALL
    }

    override fun onStop() {
        super.onStop()
        playerView.player = null
        player!!.release()
        player = null
    }

    fun getUserAgent(context: Context): String {
        val packageName = context.packageName
        val info = context.packageManager.getPackageInfo(packageName, 0)
        val appName = info.applicationInfo.loadLabel(context.packageManager).toString()
        val versionName = info.versionName
        return "$appName/$versionName (Linux;Android ${Build.VERSION.RELEASE}) ${ExoPlayerLibraryInfo.VERSION_SLASHY}"
    }
}

我认为只有两种其他解决方法,但是似乎都无法使用:

  1. 暂时将铃声静音,并在完成后恢复铃声

  2. 暂时启用请勿打扰模式。我什至不确定是否可以在不静音应用程序视频的情况下进行设置。

它们具有风险,因为它们实际上如何改变操作系统的行为,包括我可能不希望启用的行为。这也是有风险的,因为如果应用程序上存在错误,它也可能会影响此行为,并可能使其保持这种状态而不会恢复到原始状态。

问题

  1. 为什么会发生?我写的代码有什么问题?如何让视频继续以自己的音频播放而不中断铃声(和其他声音)?

  2. 是否可以使用请勿打扰API使除视频之外的所有内容保持静音?甚至隐藏提示通知也可能很好。

  3. 也许还有其他解决方法?

0 个答案:

没有答案