Чтобы проверить микрофон перед публикацией, необходимо получить значение уровня сигнала. Для этого используется класс android.media.MediaRecorder. При этом необходимо записывать аудио в файл. В версиях Android 10 и ниже, можно было записывать в псевдоустройство /dev/null. однако с Android 11 это невозможно, и требуется открывать на запись реальный файл, располагая его в данных приложения:
mRecorder = new MediaRecorder(); mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); String fileName = context.getFilesDir().getAbsolutePath() + "/test.3gp"; //Path /dev/null throw exception on Android 11 mRecorder.setOutputFile(fileName); try { mRecorder.prepare(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } mRecorder.start();
От объекта MediaRecorder можно получить мгновенное значение амплитуды сигнала
public double getAmplitude() { if (mRecorder != null) return (mRecorder.getMaxAmplitude() / 2700.0); else return 0; }
и затем усреднить его для отображения
static final private double EMA_FILTER = 0.6; private double mEMA = 0.0; ... public double getAmplitudeEMA() { double amp = getAmplitude(); mEMA = EMA_FILTER * amp + (1.0 - EMA_FILTER) * mEMA; return mEMA; }