android - 声级未显示

标签 android audio audio-recording android-sound

我想做什么?

我正在尝试制作一个记录足球(足球)反弹的应用程序。这是我第一次编写应用程序,也是第一次使用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 list 中添加了权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />

最佳答案

您需要一个侦听器来检测记录器状态的变化。目前,您仅在onCreate中设置TextView的值,但没有观察到任何东西。

您所能做的就是运行一个Thread,并且每隔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); 

关于android - 声级未显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50197608/

相关文章:

android - Android 中的实时音频录制和播放以及线程和回调处理

android - AACObject ELD数据包的AAC ADTS

android - 如何在 android 中编写 Mp3 剪辑器或切割器?

java - 带有进度对话框和按钮的 ASyncTask

java - Android - 创建音频文件的波形(OGG)

c# - UWP Windows IoT核心流路由

android - Android应用无法播放mp3(本地存储的mp3)

android - 如何制作 RxErrorHandlingCallAdapterFactory?

android - android 中的日历用户界面

android - 在Unity中打开SWF游戏