Как вы возвращаете аудио фокус на ранее воспроизводимые приложения?
Я новичок в разработке приложений для 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));
}
}