背景:今天为了修复厂商反馈的关于音频焦点交互的问题。
问题1:(听伴是我们的应用名称)听伴播放->按下静音键->听伴处于暂停状态并主机静音->按下语音键/打电话-退出语音/挂断电话->听伴抢source并播放。正确逻辑应该是听伴不抢source并且不播放。
分析1:通过分析log及与对方开发确认。系统方的静音是一个音源,静音去抢夺了音频焦点,导致听伴失去焦点后执行pause操作,但是这种pause属于被动暂停,是可以被恢复的。且对方定制了需求,当应用回到前台的时候如果不是主动暂停的话,就要去抢焦点并播放。这样就产生了逻辑冲突。
解决1:这样就不能再Activity的onResume中做当应用回到前台的时候如果不是主动暂停的话,就要去抢焦点并播放的需求了。由于各应用之间的交互是通过startActivity的方式,这样我们就可以在onNewIntent中进行焦点的定制处理。
//在我们的主Activity(MainActivity)中添加了mAudioPlayOnNewIntentInter接口的功能
//在渠道适配的时候,使用反射查找实现类,如果能找到实现类mAudioPlayOnNewIntentInter != null
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (mAudioPlayOnNewIntentInter != null) {
mAudioPlayOnNewIntentInter.resumeAudioPlayOnNewIntent();
}
}
问题2:添加了相应的功能后测试发现,MainActivity中的onNewIntent并没有走。
分析2:车机主界面中我们应用的入口是SplashActivity(闪屏页)如下方法是防止闪屏页面多次打开并显示的逻辑,因此导致了finish后直接显示了MainActivity而并没有通过startactivity的方式走,所以MainActivity中onNewIntent回调没有走
//在SplashActivity的onCreate中添加了如下方法
if (!this.isTaskRoot() && getIntent() != null) {
String action = getIntent().getAction();
if (getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
finish();
return;
}
}
解决2:在finish前主动调用跳转,这样就可以收到了onNewIntent回调
if (!this.isTaskRoot() && getIntent() != null) {
String action = getIntent().getAction();
if (getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
//startToLauncher跳转至想要去的界面
startToLauncher();
finish();
return;
}
}
private void startToLauncher() {
Intent intent = getIntent();
if (intent == null){
intent = new Intent();
}
intent.setClass(SplashActivity.this, MainActivity.class);
startActivity(intent);
}
结果:通过调试,解决了混音问题,并完善了闪屏页面的启动方法。