千家信息网

Android如何实现点击持续录音,松开结束录音并实现随着分贝的大小改变图片

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,这篇文章给大家分享的是有关Android如何实现点击持续录音,松开结束录音并实现随着分贝的大小改变图片的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。显示录音大小的DIALO
千家信息网最后更新 2025年01月21日Android如何实现点击持续录音,松开结束录音并实现随着分贝的大小改变图片

这篇文章给大家分享的是有关Android如何实现点击持续录音,松开结束录音并实现随着分贝的大小改变图片的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

显示录音大小的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页面实现

        

主界面的试下

  1. activoti.xml

  2. 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;        }    });

感谢各位的阅读!关于"Android如何实现点击持续录音,松开结束录音并实现随着分贝的大小改变图片"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0