Я просто пытаюсь воспроизвести звук с помощью MediaPlayer. Приведенный ниже код, который хорошо работает в обычном проекте Android, не воспроизводит звук через аудиоразъем или динамики монитора HDMI.

final MediaPlayer mp = MediaPlayer.create(getActivity(), R.raw.score);
mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {
    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
        return false;
    }
});
mp.start();

Я неправильно подхожу к этому? Класс MediaPlayer работает иначе с Android Things?

ОБНОВЛЕНИЕ 1

В качестве альтернативного подхода я также пробовал использовать AudioTrack для воспроизведения звука, это тоже не работает:

    int i = 0;
    byte[] music = null;
    InputStream is = getActivity().getResources().openRawResource(R.raw.score);

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
            AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
            AudioTrack.getMinBufferSize(44100,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT), AudioTrack.MODE_STREAM);

    try{
        music = new byte[512];
        at.play();

        while((i = is.read(music)) != -1)
            at.write(music, 0, i);

    } catch (IOException e) {
        e.printStackTrace();
    }

    at.stop();
    at.release();

ОБНОВЛЕНИЕ 2

Было предложено установить предпочтительное устройство. Это тоже не работает.

mAudioOutputDevice = findAudioDevice(AudioManager.GET_DEVICES_OUTPUTS, AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);

Получить устройство

private AudioDeviceInfo findAudioDevice(int deviceFlag, int deviceType) {
    AudioManager manager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
    AudioDeviceInfo[] adis = manager.getDevices(deviceFlag);
    for (AudioDeviceInfo adi : adis) {
        if (adi.getType() == deviceType) {
            return adi;
        }
    }
    return null;
}

Здесь я устанавливаю предпочтительное устройство.

    int i = 0;
    byte[] music = null;
    InputStream is = getActivity().getResources().openRawResource(R.raw.score);

    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 44100,
            AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
            AudioTrack.getMinBufferSize(44100,
                    AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT), AudioTrack.MODE_STREAM);
    at.setPreferredDevice(mAudioOutputDevice);

    try{
        music = new byte[512];
        at.play();

        while((i = is.read(music)) != -1)
            at.write(music, 0, i);

    } catch (IOException e) {
        e.printStackTrace();
    }

    at.stop();
    at.release();
1
MalcolmMcFly 13 Мар 2018 в 02:38

2 ответа

Лучший ответ

Мне удалось воспроизвести звук с помощью класса MediaPlayer и внешнего стереоадаптера USB 2.0 (показано ниже). Просто подключите адаптер к пустому USB-разъему на Raspberry Pi и аудиовходу адаптера, и он заработает.

final MediaPlayer mp = MediaPlayer.create(getActivity(), R.raw.score);
mp.start();

enter image description here

1
MalcolmMcFly 13 Мар 2018 в 08:18

Возможно, вам потребуется указать аудиошину, на которую вы хотите отправлять звуки:

private AudioDeviceInfo findAudioDevice(int deviceFlag, int deviceType) {
    AudioManager manager = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE);
    AudioDeviceInfo[] adis = manager.getDevices(deviceFlag);
    for (AudioDeviceInfo adi : adis) {
        if (adi.getType() == deviceType) {
            return adi;
        }
    }
    return null;
}

Затем найдите шину аудиоразъема:

mAudioInputDevice = findAudioDevice(AudioManager.GET_DEVICES_INPUTS, AudioDeviceInfo.TYPE_BUILTIN_MIC);
mAudioOutputDevice = findAudioDevice(AudioManager.GET_DEVICES_OUTPUTS, AudioDeviceInfo.TYPE_BUILTIN_SPEAKER);

Затем вы можете запустить audioTrack.setPreferredDevice(mAudioOutputDevice);

0
MalcolmMcFly 13 Мар 2018 в 06:45