Я пытаюсь получить текущий маршрут для моего входного аудио, вызывая 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 проходит через гарнитуру в данный момент.