Как вы возвращаете аудио фокус на ранее воспроизводимые приложения?

Я новичок в разработке приложений для Android, и у меня, как мне кажется, довольно простой вопрос, но мне трудно разобраться, как делать то, что я хочу...

У меня есть простое приложение, которое воспроизводит звук при нажатии кнопки. После воспроизведения звука я бы хотел, чтобы приложение возвращало звук к тому, что воспроизводилось до его запуска (например, если музыкальное приложение воспроизводится, во время воспроизведения звук должен прерывать музыку, а затем возвращать управление и возобновлять работу). Воспроизведение музыки. Я пытался использовать метод setOnCompletionListener, но без радости.

Вот код:

public class MainActivity extends Activity implements OnClickListener{

public MediaPlayer mp = null;
public ImageButton playm = null;
public AudioManager audioManager = null;

/** called when activity first created */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setVolumeControlStream(AudioManager.STREAM_MUSIC);
    audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

    //Sigh Button
    playm = (ImageButton) findViewById(R.id.sighButton);
    playm.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    if (v==playm){
        OnAudioFocus onAudioFocus=new OnAudioFocus(this);
        audioManager.requestAudioFocus(onAudioFocus, AudioManager.STREAM_MUSIC, 
                AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
        playSighSound();
    }
}

public void playSighSound(){
        mp = MediaPlayer.create(this, R.raw.ohboy); 
        try {
        mp.start();
        mp.setOnCompletionListener(new OnCompletionListener(){

            @Override
            public void onCompletion(MediaPlayer mp){
            mp.release();
            }
        });
        } catch (IllegalArgumentException e){
            e.printStackTrace();
        } catch (IllegalStateException e){
            e.printStackTrace();
        }
    }
}

class OnAudioFocus implements AudioManager.OnAudioFocusChangeListener{
    MainActivity onAudioFocus;

    public OnAudioFocus(MainActivity onAudioFocus){
        this.onAudioFocus = onAudioFocus;
    }


public void onAudioFocusChange(int focusChange) {
    switch(focusChange){
    case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
        onAudioFocus.playSighSound();
        break;

    }
}
}

0 ответов

Я знаю, что немного опоздал, но вот реализация того, как получить фокусировку звука, когда это необходимо, и отпустить его, когда вы закончите воспроизведение звука.

Фоновые приложения, воспроизводящие звук, остановятся, когда вы получите фокусировку звука. requestAudioFocus() для вашего приложения, и продолжит работу с того места, где они остановились, после того, как вы отпустите аудиофокус releaseAudioFocus().

Также есть реализация для API 26 и выше.

public class AudioFocusManager {

    Context context;
    private AudioFocusRequest audioFocusRequest;

    public AudioFocusManager(Context context) {
        this.context = context;
    }

    public void requestAudioFocus() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            audioFocusRequest =
                    new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
                            .build();
            getAudioManager().requestAudioFocus(audioFocusRequest);
        } else {
            getAudioManager().requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
        }
    }

    public void releaseAudioFocus() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if (audioFocusRequest != null) {
                getAudioManager().abandonAudioFocusRequest(audioFocusRequest);
                audioFocusRequest = null;
            }
        } else {
            getAudioManager().abandonAudioFocus(null);
        }
    }

    private AudioManager getAudioManager() {
        return ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE));
    }
}
Другие вопросы по тегам