как вы можете видеть здесь, вам не нужно сохранять выходные данные в файл, если вы установите выходное назначение, как показано ниже, оно нигде не будет сохранено:

ался получить уровень амплитуды микрофона на Android примерно так:

MediaRecorder recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

Timer timer = new Timer();
timer.scheduleAtFixedRate(new RecorderTask(recorder), 0, 1000);

private class RecorderTask extends TimerTask {
    private MediaRecorder recorder;

    public RecorderTask(MediaRecorder recorder) {
        this.recorder = recorder;
    }

    public void run() {
        Log.v("MicInfoService", "amplitude: " + recorder.getMaxAmplitude());
    }
}

К сожалению, это только возвращает 0 все время.

Похоже, что для этого я должен начать запись. Это правильно?

Если да, нужно ли мне записывать в течение 500 мс, получить амплитуду, остановить запись и повторить?

Наконец, мне нужно записать в файл? Мне не нужно сохранять этот аудиофайл, я не могу просто получить текущую амплитуду или максимальную амплитуду с момента последнего вызова текущего входного микрофона без записи?

Любая помощь приветствуется, спасибо.

Ответы на вопрос(4)

Решение Вопроса

вы должны сначала вызвать Recorder.start (), и вы не должны забывать также вызывать Recorder.stop () в конце!

Видетьhttp://code.google.com/p/android-labs/source/browse/trunk/NoiseAlert/src/com/google/android/noisealert/ для примера приложения вы можете взглянуть на SoundMeter.java и NoiseAlert.java

 Tom06 февр. 2011 г., 00:09
очевидно, вместо этого можно использовать AudioRecord, нет необходимости записывать файл
 kpax23 окт. 2012 г., 05:46
Вы можете перенаправить вывод аудио / мультимедиа в / dev / null и предотвратить любую реальную запись таким образом. Также убедитесь, что вы используете Recorder.prepare (), иначе он не будет работать.

для отображения данных в реальном времени на пользовательском интерфейсе вам необходимо использовать Handler:

public class SoundMeter {
private MediaRecorder mediaRecorder;
public  void start(){
    if(started){
        return;
    }
    if (mediaRecorder == null){
        mediaRecorder = new MediaRecorder();

        mediaRecorder.setAudioSource(
                MediaRecorder.AudioSource.MIC);
        mediaRecorder.setOutputFormat(
                MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(
                MediaRecorder.AudioEncoder.AMR_NB);
        mediaRecorder.setOutputFile("/dev/null");

        try{
            mediaRecorder.prepare();
        }catch (IllegalStateException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        mediaRecorder.start();
        started = true;
    }
}

}
public double getAmplitude(){
    return  mediaRecorder.getMaxAmplitude();
}
}

Эта часть показывает данные об интерфейсе пользователя:

    private Runnable pollTask = new Runnable() {
    @Override
    public void run() {
        double amplitude = soundMeter.getAmplitude();
        amplitudeTextView.setText("Amplitude: " + amplitude);

        handler.postDelayed(pollTask, 500);
    }
};

Не забудьте вызвать обработчик в методе onCreate:

handler.postDelayed(pollTask, 500);

500 - задержка в миллисекундах, которые пользовательский интерфейс будет обновлять

как вы можете видеть здесь, вам не нужно сохранять выходные данные в файл, если вы установите выходное назначение, как показано ниже, оно нигде не будет сохранено:

mediaRecorder.setOutputFile("/dev/null");

однако я не смог получить достаточно высокую частоту обновления для своих нужд. Так что я в конечном итоге с помощьюSoundMeter.java класс, который связал Toumal, но изменил его, чтобы использовать код из этогоответ

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

import android.media.AudioFormat;
import android.media.AudioRecord;
import android.media.MediaRecorder;

public class SoundMeter {

    private AudioRecord ar = null;
    private int minSize;

    public void start() {
        minSize= AudioRecord.getMinBufferSize(8000, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
        ar = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,minSize);
        ar.startRecording();
    }

    public void stop() {
        if (ar != null) {
            ar.stop();
        }
    }

    public double getAmplitude() {
        short[] buffer = new short[minSize];
        ar.read(buffer, 0, minSize);
        int max = 0;
        for (short s : buffer)
        {
            if (Math.abs(s) > max)
            {
                max = Math.abs(s);
            }
        }
        return max;
    }

}

Используйте класс AudioRecord вместо MediaRecorder

Проверьте этот сайт:http://www.doepiccoding.com/blog/?p=195 , это дает хорошее объяснение и рабочий код :)

Ваш ответ на вопрос