Уровень звука не отображается - PullRequest
0 голосов
/ 06 мая 2018

Что я пытаюсь сделать?

Я пытаюсь создать приложение, которое фиксирует отскок мяча от футбольного мяча (футбольного мяча). Я впервые пишу приложение и впервые использую Java. Одним из моих шагов является запись звука и отображение амплитуды уровня звука. Но сейчас он все еще показывает 0.0 на моем экране.

Код для отображения уровня звука

package com.example.user.sportsballbounceapp;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import java.io.IOException;

public class Football1Test extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_football1_test);

        SoundMeter Sound=new SoundMeter();
        double myValue = Sound.getAmplitude();
        String message =
                myValue == -1 ?
                        "The value is invalid." :
                        "The value is " + myValue;
        TextView tv = (TextView) findViewById(R.id.textView2);
        tv.setText(message);
    }
}

Код для измерения уровня звука

package com.example.user.sportsballbounceapp;

import android.media.MediaRecorder;

import java.io.IOException;

public class SoundMeter {

    private MediaRecorder mRecorder = null;

    public void start() throws IOException {
        if (mRecorder == null) {
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
            mRecorder.setOutputFile("/dev/null");
            mRecorder.prepare();
            mRecorder.start();
        }
    }

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

    public double getAmplitude() {
        if (mRecorder != null)
            return  mRecorder.getMaxAmplitude();
        else
            return 0;
    }
}

Результат

Результат при тестировании на моем телефоне такой же, как и в симуляторе (изображение с симулятора)

изображение

enter image description here

Обновление

Я также добавил разрешения в манифесте Android

<uses-permission android:name="android.permission.RECORD_AUDIO" />

1 Ответ

0 голосов
/ 07 мая 2018

Вам нужен слушатель, чтобы обнаружить изменения в состоянии вашего рекордера. На данный момент вы только устанавливаете значение TextView в onCreate, но ничего не наблюдаете.

Что вы можете сделать, это запустить поток, и, скажем, каждые 3 секунды измерять максимальную амплитуду, зарегистрированную с момента записи рекордера.

Это пример того, как:

final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

@Override 
public void run() { 
    try{
        myTexView.setText(mRecorder.getMaxAmplitude());
    }
    catch (Exception e) {
        // TODO: handle exception
    }
    finally{
        //also call the same runnable to call it at regular interval
        handler.postDelayed(this, 3000); //every 3 seconds
    }
} 
}; 
handler.postDelayed(runnable, 3000); 
...