Попытка направить STREAM_MUSIC на динамик и STREAM_VOICE_CALL на гарнитуру / наушники
Я пробую технику, предложенную @Michael из этого предыдущего SO- ответа, но безуспешно. Я пытаюсь одновременно воспроизводить поток STREAM_MUSIC на динамике, одновременно отправляя потоки STREAM_VOICE_CALL на подключенные наушники.
В результате оба звука воспроизводятся в наушниках (когда они подключены), либо оба звука воспроизводятся в динамике.
Я пытаюсь это на Samsung Tab E Lite под управлением 4.4.4. Я понял, что ссылка, на которую я ссылаюсь, упоминает, что не все аппаратные средства будут поддерживать такую возможность, но мне интересно, если я не настроил это неправильно.
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;
}
}