Android 按住录音 松手停止,根据声音来更换图片 播放短声

来源:互联网 发布:图书信息管理vb表格 编辑:程序博客网 时间:2024/04/30 05:01

还是项目。。。项目中需要。。。这个主要是根据分贝的不同来改变图片。直接上代码。资源等我去公司了 再上传。。

1,给控件设置触摸事件。把录制的文件存在本地指定位置//触摸事件①mRecordVoiceIV.setOnTouchListener(new View.OnTouchListener() {    @Override    public boolean onTouch(View v, MotionEvent event) {        if (event.getAction() == ACTION_DOWN) {            //文件名            //  String strDate = new SimpleDateFormat("yyyy.MM.dd_HH.mm.ss")            //        .format(new Date());            //这是文件夹路径            String path = FTConfig.FILE_PATH + "/" + mydev.getDevId();            //新建文件流            File dirFirstFolder = new File(path);            //判断是否有文件夹            if (!dirFirstFolder.exists()) {                FileUtil.createIfNotExist(path);            }            final String lastPath = path + "/" + "output" + ".mp3";            File file = new File(lastPath);            // 创建录音对象            mr = new MediaRecorder();            // 从麦克风源进行录音            mr.setAudioSource(MediaRecorder.AudioSource.MIC);            // 设置输出格式            mr.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);            // 设置编码格式            mr.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);            // 设置输出文件            mr.setOutputFile(file.getAbsolutePath());            try {                // 创建文件                file.createNewFile();                // 准备录制                mr.prepare();            } catch (IllegalStateException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            }            // 开始录制            task = new TimerTask() {                public void run() {                    dHandler.sendEmptyMessage(66);                }            };            timer.schedule(task, 1000, 1000);            mr.start();            mVoiceStateTV.setVisibility(View.VISIBLE);            mVoiceAnimIV.setVisibility(View.VISIBLE);            updateMicStatus();            mVoiceStateTV.setText(R.string.you_can_also_be_recorded_string_3clock_string);            prompt_tv.setText(R.string.hint_loose_hand_string);        }        //松开手之后。        if (event.getAction() == ACTION_UP) {            if (mr != null) {                try {                    //下面三个参数必须加,不加的话会奔溃,在mediarecorder.stop();                    //报错为:RuntimeException:stop failed                    mr.setOnErrorListener(null);                    mr.setOnInfoListener(null);                    mr.setPreviewDisplay(null);                    mr.stop();                    task.cancel();                } catch (Exception e){                    // TODO: handle exception                    Log.i("Exception", Log.getStackTraceString(e));                }                //added by ouyang end                mr.release();                mr = null;                //影藏                mVoiceStateTV.setVisibility(View.INVISIBLE);                mVoiceAnimIV.setVisibility(View.INVISIBLE);                mStartVoice.setVisibility(View.VISIBLE);                mVoiceAnimIV.setImageDrawable(imgs[0]);                prompt_tv.setText("提示:按住后开始录音");            }        }        return true;    }});②录制进行中 做出该有的判断。 private Handler dHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            if (msg.what == 66) {                its--;                if (its == 0) {                    its = 3;                    task.cancel();                    if (mr != null) {                        try {                            //下面三个参数必须加,不加的话会奔溃,在mediarecorder.stop();                            //报错为:RuntimeException:stop failed                            mr.setOnErrorListener(null);                            mr.setOnInfoListener(null);                            mr.setPreviewDisplay(null);                            mr.stop();                        } catch (Exception e) {                            // TODO: handle exception                            Log.i("Exception", Log.getStackTraceString(e));                        }                        //added by ouyang end  timer.schedule(task, 5000);  两个参数的schedule 就只是执行一次吧。//                        要用三个参数的schedule。                        mr.release();                        mr = null;                        //影藏                        mVoiceStateTV.setVisibility(View.INVISIBLE);                        mVoiceAnimIV.setVisibility(View.INVISIBLE);                        mStartVoice.setVisibility(View.VISIBLE);                        mVoiceAnimIV.setImageDrawable(imgs[0]);                    }                } else {                    mVoiceStateTV.setText(R.string.you_can_also_be_recorded_string + its + R.string.clock_string);                }            }        }    };2,获取分贝大小,改变图片  ①,放一个图片数组 imgs = new Drawable[]{            getResources().getDrawable(R.drawable.an_1),            getResources().getDrawable(R.drawable.an_2),            getResources().getDrawable(R.drawable.an_3),            getResources().getDrawable(R.drawable.an_4),            getResources().getDrawable(R.drawable.an_5),};}通知mHandler 改变图片private Handler mHandler = new Handler() {    @Override    public void handleMessage(Message msg) {        super.handleMessage(msg);        int what = msg.what;        //根据mHandler发送what的大小决定话筒的图片是哪一张        //说话声音越大,发送过来what值越大        if (what > 4) {            what = 4;        }        mVoiceAnimIV.setImageDrawable(imgs[what]);    }};private void updateMicStatus() {    if (mr != null) {        int ratio = mr.getMaxAmplitude() / BASE;        int db = 0;// 分贝        if (ratio > 1)            db = (int) (20 * Math.log10(ratio));        //我对着手机说话声音最大的时候,db达到了35左右,        mHandler.postDelayed(mThread, 300);        mHandler.sendEmptyMessage(db / 18);    }}3,播放mStartVoice.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        //读取本地播放的 mp3        String path = FTConfig.FILE_PATH + "/" + mydev.getDevId();        //新建文件流        File dirFirstFolder = new File(path);        //判断是否有文件夹        if (!dirFirstFolder.exists()) {            FileUtil.createIfNotExist(path);        }        final String lastPath = path + "/" + "output" + ".mp3";        File mp3File = new File(lastPath);        if (mp3File.exists()) {            mPlayer.stop();            mPlayer = null;            mPlayer = new MediaPlayer();            try {                mPlayer.setDataSource(lastPath);                mPlayer.prepare();                mPlayer.start();            } catch (IOException e) {                e.printStackTrace();            }        } else {        }    }});播放//猫mVoiceCatSw.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {        if (lightOnCat==false) {            mVoiceLongtimeSw.setChecked(false);            mVoiceDogSw.setChecked(false);            mPlayer.stop();//多个铃声的话,先把其他的关闭            mPlayer = null;            mPlayer = MediaPlayer.create(SetVoiceActivity.this, R.raw.cat);            mPlayer.start();//在开启            lightOnCat = true;        } else {            mVoiceLongtimeSw.setChecked(false);            mVoiceDogSw.setChecked(false);            lightOnCat = false;        }    }});

这里面需要我提供的 东西尽管说。有啥bug 给我骂出来。不要光骂,不指出。。。这样太不厚道啦

1 0
原创粉丝点击