「Android/audio/他アプリの音を制御」の版間の差分
提供: 初心者エンジニアの簡易メモ
(→フォーカス削除対応) |
|||
(同じ利用者による、間の5版が非表示) | |||
行1: | 行1: | ||
==音のフォーカスを制御== | ==音のフォーカスを制御== | ||
<pre> | <pre> | ||
+ | 音フォーカス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() { | AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() { | ||
行19: | 行34: | ||
} | } | ||
}; | }; | ||
− | + | // 音のフォーカスを取得 | |
− | 音のフォーカスを取得 | + | 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, | + | 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) { | + | 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 で要求してた場合は、バックで流してた音楽が元に戻る | ||
} | } | ||
</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); } }