「Android/audio/他アプリの音を制御」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→音のフォーカスを制御) |
(→フォーカス削除対応) |
||
| (同じ利用者による、間の4版が非表示) | |||
| 行2: | 行2: | ||
<pre> | <pre> | ||
音フォーカスonoff | 音フォーカスonoff | ||
| − | Button | + | Button audiofocusButton = (Button)findViewById(R.id.audiofocusbutton); |
| − | + | audiofocusButton.setOnClickListener(new View.OnClickListener() { | |
public void onClick(View v) { | public void onClick(View v) { | ||
| − | + | audiofocus(getApplicationContext()); | |
} | } | ||
}); | }); | ||
| − | Button | + | Button audiounfocusButton = (Button)findViewById(R.id.audiounfocusbutton); |
| − | + | audiounfocusButton.setOnClickListener(new View.OnClickListener() { | |
public void onClick(View v) { | public void onClick(View v) { | ||
| − | + | audiounfocus(getApplicationContext()); | |
} | } | ||
}); | }); | ||
| 行35: | 行35: | ||
}; | }; | ||
// 音のフォーカスを取得 | // 音のフォーカスを取得 | ||
| − | public void | + | public void audiounfocus() { |
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); | AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); | ||
int result = am.requestAudioFocus(afChangeListener, | int result = am.requestAudioFocus(afChangeListener, | ||
| 行49: | 行49: | ||
} | } | ||
// 音のフォーカスを外す | // 音のフォーカスを外す | ||
| − | public void | + | public void audiounfocus() { |
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); | AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); | ||
am.abandonAudioFocus(afChangeListener); // 音楽削除 | am.abandonAudioFocus(afChangeListener); // 音楽削除 | ||
| 行58: | 行58: | ||
} | } | ||
</pre> | </pre> | ||
| + | |||
| + | 参考:https://qiita.com/KeithYokoma/items/3896f5934478fa560a50 | ||
| + | |||
| + | ==フォーカス削除対応== | ||
| + | api26とそれ以前でメソッドが違う。 | ||
| + | |||
| + | @SuppressWarnings("deprecation") | ||
| + | private void execAudioNotFocus() { | ||
| + | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { | ||
| + | ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)).abandonAudioFocusRequest(afChangeListener); | ||
| + | } else { | ||
| + | ((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)).abandonAudioFocus(afChangeListener); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | ==参考== | ||
2018年11月26日 (月) 12:39時点における最新版
音のフォーカスを制御
音フォーカスonoff
Button audiofocusButton = (Button)findViewById(R.id.audiofocusbutton);
audiofocusButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
audiofocus(getApplicationContext());
}
});
Button audiounfocusButton = (Button)findViewById(R.id.audiounfocusbutton);
audiounfocusButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
audiounfocus(getApplicationContext());
}
});
}
// 音フォーカスイベント
AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
Log.i(TAG, "onAudioFocusChange focusChange=" + focusChange);
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
Log.i(TAG, "onAudioFocusChange focusChange=AUDIOFOCUS_LOSS_TRANSIENT");
// Pause playback
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
Log.i(TAG, "onAudioFocusChange focusChange=AUDIOFOCUS_GAIN");
// Resume playback
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
Log.i(TAG, "onAudioFocusChange focusChange=AUDIOFOCUS_LOSS");
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
Log.i(TAG, "onAudioFocusChange focusChange=AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
}
}
};
// 音のフォーカスを取得
public void audiounfocus() {
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
int result = am.requestAudioFocus(afChangeListener,
AudioManager.STREAM_MUSIC,
// AudioManager.AUDIOFOCUS_GAIN // 永続的なフォーカスを要求
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT // 一時的なフォーカスを取得
// AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE // 一時的なフォーカスを取得(システム音のフォーカスも奪う)
// AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK // バック音として小さな音にしてフォーカスを要求
);
if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.i(TAG, "AudioManager.AUDIOFOCUS_REQUEST_GRANTED");
}
}
// 音のフォーカスを外す
public void audiounfocus() {
AudioManager am = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
am.abandonAudioFocus(afChangeListener); // 音楽削除
// AUDIOFOCUS_GAIN で要求してた場合は、バック音は流れないまま。
// AUDIOFOCUS_GAIN_TRANSIENT で要求してた場合は、バックで流してた音楽が元に戻る
// AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE で要求してた場合は、バックで流してた音楽が元に戻る
// AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK で要求してた場合は、バックで流してた音楽が元に戻る
}
参考:https://qiita.com/KeithYokoma/items/3896f5934478fa560a50
フォーカス削除対応
api26とそれ以前でメソッドが違う。
@SuppressWarnings("deprecation")
private void execAudioNotFocus() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)).abandonAudioFocusRequest(afChangeListener);
} else {
((AudioManager) context.getSystemService(Context.AUDIO_SERVICE)).abandonAudioFocus(afChangeListener);
}
}
