为什么放弃Android应用程序中的音频焦点不起作用?
我正在尝试在Android上编写一些修改过的计时器。按下按钮后,新线程启动,它计算时间,在某些情况下,它应该播放声音。 在播放声音的过程中,我得到了音频焦点——在后台播放的MP3播放器,将其状态更改为“暂停”。但后来我遇到了问题——我调用了放弃对焦方法,但MP3播放器仍然暂停。在这种情况下,我找不到任何建议,只有我应该调用AudioFocus()的信息,我已经这样做了 我的代码如下。我改变了一些部分使它变短,但它仍然很长。我展示了这一切,因为我想展示整个项目的组织结构。这是我的第一个Android应用程序,因此错误可能很愚蠢:)为什么放弃Android应用程序中的音频焦点不起作用?,android,audio,Android,Audio,我正在尝试在Android上编写一些修改过的计时器。按下按钮后,新线程启动,它计算时间,在某些情况下,它应该播放声音。 在播放声音的过程中,我得到了音频焦点——在后台播放的MP3播放器,将其状态更改为“暂停”。但后来我遇到了问题——我调用了放弃对焦方法,但MP3播放器仍然暂停。在这种情况下,我找不到任何建议,只有我应该调用AudioFocus()的信息,我已经这样做了 我的代码如下。我改变了一些部分使它变短,但它仍然很长。我展示了这一切,因为我想展示整个项目的组织结构。这是我的第一个Androi
公共类MainActivity扩展活动{
按钮p1;
螺纹;
MyRunnable rn;
私有布尔值=false;
MediaPlayer mp=null;
AudioManager-audioMeg;
整数时间=0;
整数区间=0;
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//设置文本和类似的内容
PressStart startList=新建PressStart();
p1.setOnClickListener(startList);
mp=MediaPlayer.create(这个,R.raw.alarm2);
audioMeg=(AudioManager)getSystemService(Context.AUDIO\u SERVICE);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
//还有别的吗
}
类PressStart实现OnClickListener{
@凌驾
公共void onClick(视图arg0){
//计算时间和间隔
if(mPaused==false){
rn=新的MyRunnable();
螺纹=新螺纹(rn);
thread.start();
}
否则{
rn.onResume();
}
}
}
类AFChangeListener实现OnAudioFocusChangeListener{
@凌驾
音频焦点更改(int focusChange)的公共无效{
if(焦点更改==AudioManager.AUDIOFOCUS\u丢失\u瞬态){
mp.pause();
}else if(焦点更改==音频管理器。音频焦点\u增益){
mp.start();
}else if(focusChange==AudioManager.AUDIOFOCUS\u损耗){
mp.stop();
}
}
}
类MyRunnable实现Runnable{
私有对象锁;
公共MyRunnable(){
mPauseLock=新对象();
mPaused=false;
}
@凌驾
公开募捐{
int焦点;
AFChangeListener AFChangeListener=新的AFChangeListener();
对于(int i=0;i
}不要使用音频聚焦增益,而是使用音频聚焦增益瞬态 这是因为audiofocus_增益意味着所有应用程序都要停止播放,因为你不知道你会有多长时间的焦点,而瞬态意味着应用程序应该暂停,直到你放弃焦点
阅读更多内容:非常感谢:)它很有效。我只需移动
audioMeg.弃用audiofocus(afchangeelistener)如果(!mp.isPlaying())
,则在if(i%interval==)
之外添加if(!mp.isPlaying())
。如果没有它,MP3播放器将停止不到1s:)不客气,如果问题解决了,请记住接受答案
public class MainActivity extends Activity{
Button p1;
Thread thread;
MyRunnable rn;
private boolean mPaused = false;
MediaPlayer mp = null;
AudioManager audioMeg;
int time = 0;
int interval = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//set text and similar things
PressStart startList = new PressStart();
p1.setOnClickListener(startList);
mp = MediaPlayer.create(this, R.raw.alarm2);
audioMeg = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
//something more here
}
class PressStart implements OnClickListener{
@Override
public void onClick(View arg0) {
//calculate time and interval
if(mPaused == false){
rn = new MyRunnable();
thread = new Thread(rn);
thread.start();
}
else{
rn.onResume();
}
}
}
class AFChangeListener implements OnAudioFocusChangeListener{
@Override
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){
mp.pause();
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
mp.start();
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
mp.stop();
}
}
}
class MyRunnable implements Runnable {
private Object mPauseLock;
public MyRunnable() {
mPauseLock = new Object();
mPaused = false;
}
@Override
public void run() {
int focus;
AFChangeListener afChangeListener = new AFChangeListener();
for(int i = 0; i < time + 1; i++){
synchronized (mPauseLock) {
while (mPaused) {
mPauseLock.wait();
}
}
if(!mPaused){
if((i % interval == 0)){
//================================
focus = audioMeg.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if(focus == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
mp.start();
}
//while(mp.isPlaying()); when it is uncommented abandon focus still doesn't work
audioMeg.abandonAudioFocus(afChangeListener);
//=========================================
}
//something more here
Thread.sleep(1000);
}
}
}
}