为什么放弃Android应用程序中的音频焦点不起作用?

为什么放弃Android应用程序中的音频焦点不起作用?,android,audio,Android,Audio,我正在尝试在Android上编写一些修改过的计时器。按下按钮后,新线程启动,它计算时间,在某些情况下,它应该播放声音。 在播放声音的过程中,我得到了音频焦点——在后台播放的MP3播放器,将其状态更改为“暂停”。但后来我遇到了问题——我调用了放弃对焦方法,但MP3播放器仍然暂停。在这种情况下,我找不到任何建议,只有我应该调用AudioFocus()的信息,我已经这样做了 我的代码如下。我改变了一些部分使它变短,但它仍然很长。我展示了这一切,因为我想展示整个项目的组织结构。这是我的第一个Androi

我正在尝试在Android上编写一些修改过的计时器。按下按钮后,新线程启动,它计算时间,在某些情况下,它应该播放声音。 在播放声音的过程中,我得到了音频焦点——在后台播放的MP3播放器,将其状态更改为“暂停”。但后来我遇到了问题——我调用了放弃对焦方法,但MP3播放器仍然暂停。在这种情况下,我找不到任何建议,只有我应该调用AudioFocus()的信息,我已经这样做了

我的代码如下。我改变了一些部分使它变短,但它仍然很长。我展示了这一切,因为我想展示整个项目的组织结构。这是我的第一个Android应用程序,因此错误可能很愚蠢:)

公共类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)
,则在
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);
                }
            }   
    }
}