我正在尝试在播放视频(使用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}"
}
}
我认为只有两种其他解决方法,但是似乎都无法使用:
暂时将铃声静音,并在完成后恢复铃声
暂时启用请勿打扰模式。我什至不确定是否可以在不静音应用程序视频的情况下进行设置。
它们具有风险,因为它们实际上如何改变操作系统的行为,包括我可能不希望启用的行为。这也是有风险的,因为如果应用程序上存在错误,它也可能会影响此行为,并可能使其保持这种状态而不会恢复到原始状态。
为什么会发生?我写的代码有什么问题?如何让视频继续以自己的音频播放而不中断铃声(和其他声音)?
是否可以使用请勿打扰API使除视频之外的所有内容保持静音?甚至隐藏提示通知也可能很好。
也许还有其他解决方法?