怎么把实时获得的音量值展示在TextView中

qq_40748745 2017-11-15 03:11:58
写了一个实时测量麦克风音量大小的代码,但是不知怎么才能把logcat里输出的分贝大小实时展现在TextView中。求教。

这是第一个Activity文件
import android.media.MediaRecorder;
import android.os.Handler;
import android.util.Log;

import java.io.File;
import java.io.IOException;



public class RecordManager
{

private final String TAG = "RecordManager";
private MediaRecorder mMediaRecorder;
public static final int MAX_LENGTH = 1000 * 60 * 10;// 最大录音时长1000*60*10;
private File file;

public RecordManager(){

}
public RecordManager(File file){
this.file = file;
}


private long startTime;
private long endTime;

/**
* 开始录音 使用amr格式
*
* mRecAudioFile(录音文件)
*
* @return
*/

public void startRecord() {
// 开始录音
/* ①Initial:实例化MediaRecorder对象 */
if (mMediaRecorder == null)
mMediaRecorder = new MediaRecorder();
try {

/* ②setAudioSource/setVedioSource */
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风MediaRecorder.AudioSource.MIC
/*
* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
* ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
*/
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
/* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
/* ③准备 */
mMediaRecorder.setOutputFile(file.getAbsolutePath());
mMediaRecorder.setMaxDuration(MAX_LENGTH);
mMediaRecorder.prepare();
/* ④开始 */
mMediaRecorder.start();
// AudioRecord audioRecord.
/* 获取开始时间* */
startTime = System.currentTimeMillis();
// pre=mMediaRecorder.getMaxAmplitude();
updateMicStatus();
Log.i("ACTION_START", "startTime" + startTime);
} catch(IllegalStateException e){
Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
} catch(IOException e){
Log.i(TAG, "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
}

}



/**
* 停止录音
*
* mMediaRecorder(录音文件)
*/
public long stopRecord() {
if (mMediaRecorder == null)
return 0L;
endTime = System.currentTimeMillis();
Log.i("ACTION_END", "endTime" + endTime);
mMediaRecorder.stop();
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
Log.i("ACTION_LENGTH", "Time" + (endTime - startTime));
return endTime - startTime;
}



private final Handler mHandler = new Handler();
private Runnable mUpdateMicStatusTimer = new Runnable() {
public void run() {
updateMicStatus();
}
};



/**
* 更新话筒状态 分贝是也就是相对响度 分贝的计算公式K=20lg(Vo/Vi) Vo当前振幅值 Vi基准值为600:我是怎么制定基准值的呢? 当20
* * Math.log10(mMediaRecorder.getMaxAmplitude() / Vi)==0的时候vi就是我所需要的基准值
* 当我不对着麦克风说任何话的时候,测试获得的mMediaRecorder.getMaxAmplitude()值即为基准值。
* Log.i("mic_", "麦克风的基准值:" + mMediaRecorder.getMaxAmplitude());前提时不对麦克风说任何话
*/
private int BASE = 1;
private int SPACE = 100;// 间隔取样时间

private void updateMicStatus() {
if (mMediaRecorder != null) {
int ratio = (int)mMediaRecorder.getMaxAmplitude() /BASE;
int db = 0;// 分贝
if (ratio > 1)
db = (int) (20 * Math.log10(ratio));
Log.d(TAG,"分贝值:"+db);
mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);


/*
* if (db > 1) { vuSize = (int) (20 * Math.log10(db)); Log.i("mic_",
* "麦克风的音量的大小:" + vuSize); } else Log.i("mic_", "麦克风的音量的大小:" + 0);
*/
}
}
}
这是第二个
import android.support.v7.app.AppCompatActivity;
import android.os.Environment;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import java.io.File;
import java.io.IOException;


public class MainActivity extends AppCompatActivity{

private Button btnstart;


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

btnstart = (Button) findViewById(R.id.bt1);
btnstart.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
File dir = new File(Environment.getExternalStorageDirectory(), "sound");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, System.currentTimeMillis() + ".amr");
if (!file.exists()) {
try {
file.createNewFile();
} catch (IOException e) {

e.printStackTrace();
}
}
new RecordManager(file).startRecord();
}
});
}
}
...全文
180 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ganshenml 2017-11-17
  • 打赏
  • 举报
回复
主线程直接setText即可
202005021116 应用层 2017-11-15
  • 打赏
  • 举报
回复
既然已经可以在logcat里输出分贝大小,那你就直接用TextView的setText设置就可以了,动态刷新TextView,不要在子线程操作

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧