この以前のSOの回答から@Michaelが提案した手法を試していますが、運がありません。STREAM_VOICE_CALL ストリームをプラグインされたイヤフォンに送信しながら、同時に STREAM_MUSIC ストリームをスピーカーに再生しようとしています。
その結果、両方のサウンドがイヤフォンで再生され (プラグインされている場合)、または両方のサウンドがスピーカーで再生されます。
4.4.4 を実行している Samsung Tab E Lite でこれを試しています。私が参照しているリンクには、すべてのハードウェアがそのような機能をサポートしているわけではないことが記載されていることに気付きましたが、それ以外の方法でこれを正しく設定していないかどうか疑問に思っています。
public class MainActivity extends AppCompatActivity {
MediaPlayer mpVoice;
MediaPlayer mpMusic;
private AudioManager mAudioManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
//mAudioManager.setMode(AudioManager.MODE_IN_CALL);
//mAudioManager.setSpeakerphoneOn(false);
//mAudioManager.setWiredHeadsetOn(false);
configureForceSpeaker();
}
private void configureForceSpeaker() {
int FOR_MEDIA = 1;
int FORCE_NONE = 0;
int FORCE_SPEAKER = 1;
Class audioSystemClass;
Method setForceUse;
try {
audioSystemClass = Class.forName("android.media.AudioSystem");
setForceUse = audioSystemClass.getMethod("setForceUse", int.class, int.class);
setForceUse.invoke(null, FOR_MEDIA, FORCE_SPEAKER);
} catch (Exception e){
e.printStackTrace();
}
}
public void startVoice(View view){
if (mpVoice == null) {
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.voice);
mpVoice = new MediaPlayer();
try {
mpVoice.setAudioStreamType(AudioManager.STREAM_VOICE_CALL);
mpVoice.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mpVoice.setLooping(true);
mpVoice.prepare();
} catch (Exception e) {
e.printStackTrace();
}
mpVoice.start();
}
}
public void stopVoice(View view){
mpVoice.stop();
mpVoice = null;
}
public void startMusic(View view){
if (mpMusic == null) {
AssetFileDescriptor afd = getResources().openRawResourceFd(R.raw.music);
mpMusic = new MediaPlayer();
try {
mpMusic.setAudioStreamType(AudioManager.STREAM_MUSIC);
mpMusic.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
mpMusic.setLooping(true);
mpMusic.setVolume(0.3f, 0.3f);
mpMusic.prepare();
} catch (Exception e) {
e.printStackTrace();
}
mpMusic.start();
}
}
public void stopMusic(View view){
mpMusic.stop();
mpMusic = null;
}
}