facebook twitter hatena line email

「Android/audio/他アプリの音を制御」の版間の差分

提供: 初心者エンジニアの簡易メモ
移動: 案内検索
(音のフォーカスを制御)
(フォーカス削除対応)
 
(同じ利用者による、間の3版が非表示)
行2: 行2:
 
<pre>
 
<pre>
 
音フォーカスonoff
 
音フォーカスonoff
Button audioforcsButton = (Button)findViewById(R.id.audioforcsbutton);
+
Button audiofocusButton = (Button)findViewById(R.id.audiofocusbutton);
audioforcsButton.setOnClickListener(new View.OnClickListener() {
+
audiofocusButton.setOnClickListener(new View.OnClickListener() {
 
     public void onClick(View v) {
 
     public void onClick(View v) {
         audioforcs(getApplicationContext());
+
         audiofocus(getApplicationContext());
 
     }
 
     }
 
});
 
});
Button audiounforcsButton = (Button)findViewById(R.id.audiounforcsbutton);
+
Button audiounfocusButton = (Button)findViewById(R.id.audiounfocusbutton);
audiounforcsButton.setOnClickListener(new View.OnClickListener() {
+
audiounfocusButton.setOnClickListener(new View.OnClickListener() {
 
     public void onClick(View v) {
 
     public void onClick(View v) {
         audiounforcs(getApplicationContext());
+
         audiounfocus(getApplicationContext());
 
     }
 
     }
 
});
 
});
行35: 行35:
 
};
 
};
 
// 音のフォーカスを取得
 
// 音のフォーカスを取得
public void audiounforcs() {
+
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 audiounforcs() {
+
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);
 +
    }
 +
}
  
 
==参考==
 
==参考==
https://qiita.com/KeithYokoma/items/3896f5934478fa560a50
 

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);
    }
}

参考