如果是在线播放音乐自动暂停,有可能是休眠状态下,WLAN断开连接,导致无法继续播放音乐。请打开手机设置 > 电池 > 更多电池设置 > 休眠时始终保持网络连接;部分车载系统在主界面时禁止通过蓝牙播放音乐,如果车载界面进行切换,也会导致音乐无声,建议切换至车载的媒体界面进行音乐播放。确认蓝牙设备是否支持暂停/播放音乐的功能,有可能在耳机端误触,导致音乐自动暂停。建议在手机端进行音乐播放 *** 作。确认手机和蓝牙设备是否发生断连。有可能由于距离过长,导致断开连接后,音乐播放暂停。如果设备自动重连成功后,音乐仍是暂停状态。建议在蓝牙有效距离内使用。
手机蓝牙,和车载连接,播放总会断可,可能是手机信不好,还有你连接失败后在去 *** 作,是必须要把汽车停住了连接才有效的,降车速去 *** 作是不行的,就会出现连接上还会停止播放的如果要是断开了连接播放,是必须停车去在重新设置连接上的,希望你开车的时候要注意安全听,要想 *** 作也要把车停下车去安全的地方,不要违章啊,生命诚可贵,音乐可不听,
引子
说 Audio Focus 前先说个很简单需求:来电时暂停正在播放的音乐,电话结束时恢复播放。
音频焦点
问题的解决方法就是:请求系统的音频焦点(Request the Audio Focus)。
官方文档指出Android 在处理音频播放是分了多个“音频流”的,如音乐流、音效流、电话声音流等,使控制音量时可以互不干涉。多数情况下我们播放音乐都是使用 STREAM_MUSIC 音频流。
另外,系统中可能会有多个应用程序会播放音频,所以需要考虑他们之间该如何协调,为了避免同时播放音乐,Android 系统使用音频焦点来进行统一管理,即只有获得了音频焦点的应用程序才可以播放音乐。
那么,播放音频应该这样来做:
获取音频焦点 requestAudioFocus
获取成功后,开始播放音频
处理音频焦点的丢失和“DUCK”
播放完毕后取消焦点
如此便可以完美的解决引子里的需求。
一个简单的示例
MusicServicejava
public class MusicService extends Service {
private AudioManager mAm;
private boolean isPlaymusic;
private String url;
private MediaPlayer mediaPlayer;
@Override
public void onCreate() {
superonCreate();
mAm = (AudioManager) getSystemService(AUDIO_SERVICE);
}
@Override
public void onStart(Intent intent, int startId) {
if (intent != null) {
Bundle bundle = intentgetExtras();
if (bundle != null) {
isPlaymusic = bundlegetBoolean("isPlay", true);
url = bundlegetString("url");
if (isPlaymusic)
play();
else
stop();
}
}
}
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManagerAUDIOFOCUS_LOSS_TRANSIENT) {
// Pause playback
pause();
} else if (focusChange == AudioManagerAUDIOFOCUS_GAIN) {
// Resume playback
resume();
} else if (focusChange == AudioManagerAUDIOFOCUS_LOSS) {
// mAmunregisterMediaButtonEventReceiver(RemoteControlReceiver);
mAmabandonAudioFocus(afChangeListener);
// Stop playback
stop();
}
}
};
private boolean requestFocus() {
// Request audio focus for playback
int result = mAmrequestAudioFocus(afChangeListener,
// Use the music stream
AudioManagerSTREAM_MUSIC,
// Request permanent focus
AudioManagerAUDIOFOCUS_GAIN);
return result == AudioManagerAUDIOFOCUS_REQUEST_GRANTED;
}
private void resume() {
if (mediaPlayer != null) {
mediaPlayerstart();
}
}
private void pause() {
if (mediaPlayer != null && mediaPlayerisPlaying()) {
mediaPlayerpause();
}
}
OnCompletionListener completionListener = new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer player) {
if(!playerisLooping()){
mAmabandonAudioFocus(afChangeListener);
}
}
};
private void play() {
if (requestFocus()) {
if (mediaPlayer == null) {
try {
mediaPlayer = new MediaPlayer();
mediaPlayersetDataSource(url);
mediaPlayerprepare();
mediaPlayersetOnCompletionListener(completionListener);
} catch (IOException e) {
eprintStackTrace();
}
}
if (!mediaPlayerisPlaying()) {
mediaPlayerstart();
}
}
}
@Override
public void onDestroy() {
superonDestroy();
if (mediaPlayer != null)
mediaPlayerrelease();
}
private void stop() {
if (mediaPlayer != null) {
mediaPlayerstop();
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
}
经模拟器测试,当来电时音频焦点会给到铃声流,并打出日志:
I/AudioService(1235): AudioFocus requestAudioFocus() from AudioFocus_For_Phone_Ring_And_Calls
此时MusicService中的afChangeListener会得到AUDIOFOCUS_LOSS_TRANSIENT,于是会暂停播放音频。
当通话结束或者挂掉电话,afChangeListener会得到AUDIOFOCUS_GAIN,于是恢复播放音频。
注意:
播放完毕一定要禁止掉请求的音频焦点abandonAudioFocus(afChangeListener),否则,如果播放完毕后的某个时段刚好有个通话结束,并且此时没有其他的应用占用了焦点,系统会重新通知服务里的afChangeListener,导致音频再次的播放。
如果丢失的短暂音频焦点允许DUCK状态AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK,在这种情况下,应用程序降低音量继续播放,不需要暂停。再次获取后,恢复原来的音量。
平时开发的时候 遇到这样的一个问题: 我开着系统的音乐播放器,我在我的应用程序里面播一段音乐 两个音乐会同时播放通过在stackoverflow查资料后才发行我们得自己音乐需要获取焦点,在我们音乐播完了以后释放掉焦点。这样系统的歌曲会继续播放下面介绍一下步骤
1获取AudioManager对象
AudioManager am = (AudioManager) getSystemService(ContextAUDIO_SERVICE);
2 注册OnAudioFocusChangeListener监听
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManagerAUDIOFOCUS_LOSS_TRANSIENT) {
if(mediaPlayerisPlaying()){
mediaPlayerpause();
}
<p>
最近刚好有碰到第三方播放与我自己播放的冲突问题,因为其实对Android的音频开发并不是很了解,再经过各种Google后是成功的解决了这个问题,便顺便记录下来。
1处理第三方播放器暂停与恢复首先得知道第三方播放器用的是什么播放的?
Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack,
所以很自然的MediaPlayer是更加适合于第三方的播放器的,但是如果某些播放器用的并不是MediaPlayer那我也没有办法了,不在考虑的范围内
2怎么暂停与恢复第三方播放器
其实标题就已经说明了,AudioFocus这个其实是音频焦点,一般情况下音乐播放器都会处理这个音频焦点的,在其丢失音频焦点的情况会将音频暂停或者停止的逻辑的,等到再次获取到音频焦点的情况下会再次恢复播放的。
怎么让第三方播放器失去音频焦点呢?自然是让我们的MediaPlayer获取到焦点就好了
基本把原理都说明了,接下来贴下来我简单封装的MediaPlayerUtil类
简单的使用还是没有问题的,因为我使用的场景也只是播放一小段音频,所以大家只需要参考使用音频焦点的部分就好了
如果我们在此基础上更深入一步,控制音乐播放的同时,我们还需要得到正在播放的音乐名称,这又该怎么实现呢?Android Framework 提供了非常棒的 androidmedia,凡音乐播放都离不开 MediaPlayer,该类定义了七个内部类,其中 MediaPlayerOnPreparedListener 是这么描述的:Interface definition for a callback to be invoked when the media source is ready for playback媒体文件准备结束,准备播放时,Android 就会调用这个这个内部类,在 MediaPlaybackService 则是 notifyChange(String what) 方法进行处理:private void notifyChange(String what) { Intent i = new Intent(what); iputExtra(”id”, IntegervalueOf(getAudioId())); iputExtra(”artist”, getArtistName()); iputExtra(”album”,getAlbumName()); iputExtra(”track”, getTrackName()); sendBroadcast(i); // …… }那么在我们的应用当中,则需要创建 一个BroadcastReceiver,过滤对应的 action name,也就是常量 META_CHANGED 对应的值即可达到目标。 查看原帖>>
开发音视频的时候,都会遇到音频焦点的相关问题;那啥是音频焦点呢?
我理解的音频焦点是,
就像上课一样,老师问了一个问题,大家都可以回答问题,如果大家都在下面回答,那么7嘴8舌的,声音就很嘈杂,谁的都听不清,这个时候,老师会说,知道答案的举手,举手的同学很多,老师就会选择其中一个把话筒递给他回答,选中的这个回答完了,老师又会把话筒递给下一个举手回答的;在这个过程中,没有拿到话筒的学生能不能说话呢,依旧是可以的,只是我们按照惯例,没有话筒的学生需要肃静;所以音频焦点不是强制的,只是大家都遵守的一个规定;
在上面的例子中,每一个学生就是一个音视频的app,老师就是audiomanager,学生举手,就是在申请音频焦点,话筒就是音频焦点。
例如,
1我正在放qq音乐,如果此时我再播放腾讯视频,总不能放视频的同时,再播放这音乐,那么我们就听不清视频里的人物在说的是啥了,所以在播放腾讯视频前,会告诉audiomanager,腾讯视频要占用音频焦点了,audiomanager会通知qq音乐,你已经失去焦点了,那么失去焦点的qq音乐,就会去暂停自己的播放;
2我在用咕咚,然后打开喜马拉雅,我咕咚需要暂停吗,不需要,因为咕咚只会在固定的1公里,2公里进行短暂的播报,所以他在焦点丢失的时候,不需要去暂停;
开发的时候,如果是使用mediaplayer ,我们需要自己去申请音频焦点,监听焦点的获取和丢失,这个一般有三种类型的焦点,网上百度有好多;其中一个是AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK,这种duck使用的场景主要是你播放视频的时候,来了一条短信,短信一般是叮咚一下就结束,所以短信申请的是duck类型的音频焦点,视频失去焦点的类型就是:AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
但是我们再开发VideoView的时候,又不太一样;下面是videoview提供的方法
这个方法给我的感受就是videoview会自己管理音频焦点
实际开发中,应该啥时候请求焦点,啥时候释放焦点?
明天写个demo自己验证一下;
以上就是关于手机连接车载蓝牙后播放音乐总是暂停全部的内容,包括:手机连接车载蓝牙后播放音乐总是暂停、Android 音频焦点(Audio Focus)、android audiomanager怎么获取音频焦点等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)