AudioRecord.getRoutedDevice() возвращает значение null на большинстве устройств Android.

Я пытаюсь получить текущий маршрут для моего входного аудио, вызывая AudioRecord.getRoutedDevice(); во время записи, но на большинстве устройств Android API23+ он возвращает null (из 300 тысяч различных устройств Android только 10% возвращают значимую информацию). Даже на устройствах одной и той же модели (Samsung Galaxy S5, 6.0.1) 70 % устройств возвращают null, а 30 % — правильную информацию.

Я попытался отладить это с помощью отражения и реплицировал часть кода SDK, чтобы пройти через него, и я вижу, что внутри AudioRecord.getRoutedDevice(); я получаю разумный ответ как от native_getRoutedDeviceId(), так и от getAudioManager().getDevices(), но тогда идентификаторы не совпадают:

@TargetApi(23)
private AudioDeviceInfo getRoutedDevice() {
    Object r = (Object)(0);
    try {
        Method method = _record.getClass().getDeclaredMethod("native_getRoutedDeviceId");
        method.setAccessible(true);
        r = method.invoke(_record);
    } catch (Exception e) {
        e.printStackTrace();
    }

    int deviceId = (int)r; //native_getRoutedDeviceId();
    if (deviceId == 0)
        return null;

    AudioDeviceInfo[] devices =
            getAudioManager().getDevices(AudioManager.GET_DEVICES_INPUTS);

    for (int i = 0; i < devices.length; i++)
        if (devices[i].getId() == deviceId)
            return devices[i];
    return null;
}

Что я мог сделать неправильно, и есть ли какой-либо другой API, который я мог бы использовать?

Старый API, такой как AudioManager.isWiredHeadsetOn(), например, не гарантирует, что аудио IO проходит через гарнитуру в данный момент.


person john316    schedule 01.09.2017    source источник


Ответы (1)


Из документов.

Примечание. Запрос действителен только в том случае, если AudioRecord в данный момент записывает. Если это не так, getRoutedDevice() вернет null.

person MaxF    schedule 03.12.2018
comment
›Я пытаюсь получить текущий маршрут для входного аудио, вызвав AudioRecord.getRoutedDevice(); во время записи - person john316; 05.12.2018
comment
Вы нашли решение? - person MaxF; 20.12.2018
comment
нет, я этого не делал, в итоге я обошел это, запросив AudioManager для маршрутов Bluetooth и типа подключенных устройств AudioDeviceInfo. - person john316; 21.12.2018