Android仿微信录制语音

前言
我把录音分成了两部分
1.UI界面,弹窗读秒
2.一个类(包含开始、停止、创建文件名功能)

第一部分

由于6.0权限问题,点击按钮申请权限通过则弹窗,如何申请权限

弹窗布局popw_record.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="260dp"
        android:layout_marginLeft="50dp"
        android:layout_marginRight="50dp"
        android:background="@drawable/take_phone"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/close"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:padding="10dp"
            android:src="@mipmap/guanbi" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="50dp"
            android:layout_marginRight="50dp"
            android:gravity="center"
            android:orientation="vertical">

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/luyin" />

            <Chronometer
                android:id="@+id/timer"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="20dp"
                android:format="%s" />

            <TextView
                android:id="@+id/startRecord"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/playrecord"
                android:layout_marginTop="20dp"
                android:background="@color/background"
                android:padding="10dp"
                />

        LinearLayout>
    RelativeLayout>

LinearLayout>

弹弹弹

 /**
     * 开始录音
     */
    private void showPopup() {

        final View contentView = LayoutInflater.from(Orderdeatil.this).inflate(R.layout.popw_record, null);
        mPopWindow = new PopupWindow(contentView, ActionBar.LayoutParams.MATCH_PARENT, ActionBar.LayoutParams.WRAP_CONTENT, true);
        mPopWindow.setContentView(contentView);

        TextView startRe = (TextView) contentView.findViewById(R.id.startRecord);
        startRe.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_UP://松开事件发生后执行代码的区域

                        if (mPopWindow != null) {
                            mPopWindow.dismiss();
                            sr.stopRecording();
                        }

                        break;
                    case MotionEvent.ACTION_DOWN://按住事件发生后执行代码的区域

                        Chronometer timer = (Chronometer) contentView.findViewById(R.id.timer);
                        timer.setBase(SystemClock.elapsedRealtime());//计时器清零
                        timer.start();//开始录音的提示

                        sr.startRecording();

                        break;
                    case MotionEvent.ACTION_CANCEL:

                        if (mPopWindow != null) {
                            mPopWindow.dismiss();
                            sr.stopRecording();//停止录音
                        }

                        break;
                    default:
                        break;
                }
                return true;
            }
        });
        ImageView close = (ImageView) contentView.findViewById(R.id.close);
        close.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mPopWindow.dismiss();
            }
        });


        mPopWindow.setTouchable(true);
        mPopWindow.setFocusable(true);
        mPopWindow.setBackgroundDrawable(new BitmapDrawable());
        mPopWindow.setOutsideTouchable(true);
        mPopWindow.setTouchInterceptor(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_OUTSIDE) {
                    mPopWindow.dismiss();
                    return true;
                }
                return false;
            }
        });
        View rootview = LayoutInflater.from(Orderdeatil.this).inflate(R.layout.activity_orderdeatil, null);
        mPopWindow.showAtLocation(rootview, Gravity.CENTER, 0, 0);

    }

第二部分 工具类

class SoundRecorder {

        public void startRecording() {
            mRecorder = new MediaRecorder();
            mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
            mRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
            mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
            mRecorder.setOutputFile(newFileName());

            try {
                // 准备好开始录音
                mRecorder.prepare();

                mRecorder.start();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        }

        public void stopRecording() {
            if (mRecorder != null) {
                //added by ouyang start
                try {
                    //下面三个参数必须加,不加的话会奔溃,在mediarecorder.stop();
                    //报错为:RuntimeException:stop failed
                    mRecorder.setOnErrorListener(null);
                    mRecorder.setOnInfoListener(null);
                    mRecorder.setPreviewDisplay(null);
                    mRecorder.stop();
                } catch (IllegalStateException e) {
                    // TODO: handle exception
                    Log.i("Exception", Log.getStackTraceString(e));
                } catch (RuntimeException e) {
                    // TODO: handle exception
                    Log.i("Exception", Log.getStackTraceString(e));
                } catch (Exception e) {
                    // TODO: handle exception
                    Log.i("Exception", Log.getStackTraceString(e));
                }
                //added by ouyang end

                mRecorder.release();
                mRecorder = null;

                upRecord();
            }
        }

        public String newFileName() {
            mFileName = Environment.getExternalStorageDirectory()
                    .getAbsolutePath();

            String s = new SimpleDateFormat("yyyy-MM-dd hhmmss")
                    .format(new Date());
            return mFileName += "/rcd_" + s + ".mp3";
        }
    }

这是从我代码中择出来的,加上权限应该是可以的。

你可能感兴趣的:(android)