android按住录音按钮_[Android]实现点击持续录音,松开结束录音,并实现随着分贝的大小改变图片...

该博客详细介绍了如何在Android应用中实现一个功能,即用户按住录音按钮时开始录音,松开按钮则停止录音。同时,根据录音的分贝大小动态改变界面上的图片来实时反馈音量状态。通过`VioceDomio`类和相关布局文件,展示了如何创建和管理录音对话框,以及根据录音分贝值更新图像资源的方法。
摘要由CSDN通过智能技术生成

显示录音大小的DIALOG实现

public class VioceDomio {

private Context mContext;

private AlertDialog dialog ;

private AlertDialog.Builder adialogbuile;

private ImageView vioce_show;

public VioceDomio(Context mContext) {

this.mContext=mContext;

}

public void showRecordingDialog() {

adialogbuile = new AlertDialog.Builder(mContext, R.style.Theme_AudioDialog);

LayoutInflater inflater = LayoutInflater.from(mContext);

View view=inflater.inflate(R.layout.voice_chage,null);

vioce_show=(ImageView) view.findViewById(R.id.vioce_show);

adialogbuile.setView(view);

dialog = adialogbuile.create();

dialog.show();

dialog. getWindow().setLayout(500, 450);

}

public void HideRecordingDialog() {

if(dialog!=null && dialog.isShowing()) {

dialog.dismiss();

dialog=null;

}

}

public void ChangeRecordingDialog(double db) { //根据录音的分贝改变大小

if(db>=1 && db<=18) {

vioce_show.setImageResource(R.drawable.voicesearch_feedback001);

}else if(db>=19 && db<=37) {

vioce_show.setImageResource(R.drawable.voicesearch_feedback002);

}else if(db>=19 && db<=37) {

vioce_show.setImageResource(R.drawable.voicesearch_feedback003);

}

else if(db>=38 && db<=56) {

vioce_show.setImageResource(R.drawable.voicesearch_feedback004);

}else if(db>=57 && db<=75) {

vioce_show.setImageResource(R.drawable.voicesearch_feedback005);

}else if(db>=76 && db<=94) {

vioce_show.setImageResource(R.drawable.voicesearch_feedback006);

}else if(db>=95 && db<=100) {

vioce_show.setImageResource(R.drawable.voicesearch_feedback007);

}

}

}

Dialog加载的XML页面实现

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="90dp"

android:layout_marginTop="5dp"

android:id="@+id/bianhua">

android:id="@+id/vioce_show"

android:layout_width="wrap_content"

android:layout_height="50dp"

android:layout_alignParentBottom="true"

android:layout_alignParentTop="true"

android:layout_centerHorizontal="true"

android:src="@drawable/voicesearch_feedback001" />

android:id="@+id/textView1"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:text="正在录音中"

android:gravity="center"

/>

主界面的试下

activoti.xml

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/speak"

android:layout_width="wrap_content"

android:layout_height="42dp"

android:layout_marginLeft="5dp"

android:layout_marginRight="5dp"

android:paddingLeft="10dp"

android:layout_weight="0.62"

android:background="@drawable/search_ba"

android:drawableLeft="@drawable/speak_1"

android:gravity="center"

android:text="按住请讲话!!!"

android:textSize="15sp"

android:singleLine="true"

android:visibility="gone"

/>

MainActiovity.java实现

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.activoti);

send=(Button) findViewById(R.id.send);

viocedomio=new VioceDomio(this);

speak.setOnTouchListener(new View.OnTouchListener() {

public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub

CountingThreadextends thend=new CountingThreadextends();

if(event.getAction()==MotionEvent.ACTION_DOWN) { //如果按钮处于按下状态

//录音

if(!Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {

Toast.makeText(ChatActivity.this, "SD not ", Toast.LENGTH_SHORT).show();

return false;

}

String sound_path=time_path+"sound.amr";

try{

soundfile=new File(Environment.getExternalStorageDirectory().getCanonicalFile()+"/bishevoice/"+sound_path);

Log.d("send_filepath", Environment.getExternalStorageDirectory().getCanonicalFile()+"/bishevoice/"+sound_path);

mmedio=new MediaRecorder();

mmedio.setAudioSource(MediaRecorder.AudioSource.MIC);

mmedio.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);

mmedio.setOutputFile(soundfile.getAbsolutePath());

mmedio.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

try{

//创建文件,准备录制

soundfile.createNewFile();

mmedio.prepare();

}catch(IllegalStateException e) {

e.printStackTrace();

}

//开始录制

thend.start();

mmedio.start();

speak.setText("松开停止录音");

viocedomio.showRecordingDialog(); //显示录音的大小

final Handler mHandler = new Handler() {

@Override

public void handleMessage(Message msg) {

viocedomio.ChangeRecordingDialog(Double.parseDouble(msg.obj.toString()));

}

};

new Thread(new Runnable() { //启动线程根据改变录音显示大小

@Override

public void run() {

// TODO Auto-generated method stub

while(mmedio!=null) {

double ratio = (double)mmedio.getMaxAmplitude() ;

double db = 0;// 分贝

if (ratio > 1)

db = 20 * Math.log10(ratio);

// Log.d(TAG,分贝值:+db);

// mHandler.postDelayed(mUpdateMicStatusTimer, SPACE);

Message msg=new Message();

msg.obj=db;

mHandler.sendMessage(msg);

}

}

}).start();

}catch(Exception e) {

e.printStackTrace();

}

}

if(event.getAction()==MotionEvent.ACTION_UP) { //如果是松开

if(soundfile != null && soundfile.exists()) { //停止录音

try {

mmedio.setOnErrorListener(null);

mmedio.setOnInfoListener(null);

mmedio.setPreviewDisplay(null);

mmedio.stop();

thend.interrupt();

//timetask.cancel();

}catch(Exception e) {

Log.i("Exception", Log.getStackTraceString(e));

}

mmedio.release();

mmedio=null;

speak.setText("按住请讲话!!!");

String content="";

if(content.isEmpty()) {

viocedomio.HideRecordingDialog(); //隐藏录音标志

Msg msg=new Msg(content,Msg.TYPE_SENT,Msg.TYPE_SENT_VOICE,Integer.toString(time_int),file_path);

msg.setChattype(0);

msglist.add(msg);

adapter.notifyDataSetChanged(); //当有新消息时,刷新listview中的显示

msgListView.setSelection(msglist.size()-1); //将listview定位到最后一行

}

}

}

return true;

}

});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值