Попытка направить 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;
    }
}

0 ответов

Другие вопросы по тегам