Android-实现一个简单的录音机功能程序

手机的录音功能随处可见,今以一个简单的实例来阐述如何实现一个简单的录音机功能。
UI元素:四个按钮分别执行表示录音、停止、播放和删除操作。ListView展示录音片段。我们暂时存在于SD卡,对于录音的长度不作限制。

以下是具体的实现逻辑与代码,代码写的比较乱,特此深表惭愧。。
编写布局文件 main.xml文件




    


    

    

    

    

    


    
    

我们在MainActivity中声明一下常量、变量、实例等。其具体意义视命名而解。

    private ImageButton record;

    private ImageButton stop;

    private ImageButton play;

    private ImageButton delete;

    private ListView listView;

    private String strTempFile = "ex07_11_";

    private File myRecAudioFile;

    private File myRecAudioDir;

    private File myPlayFile;

    private MediaRecorder mediaRecorder01;//录音器对象

    private ArrayList recordFiles;//文件

    private ArrayAdapter adapter;

    private TextView textView;

    private boolean sdCardExit;//SD卡是否存在

    private boolean isStopRecoder;

在onCreate方法中,取得元素并判断设备SD的存在性

        //四个按钮两个文本控件
        record = (ImageButton)findViewById(R.id.imagebutton_recorder);
        stop = (ImageButton)findViewById(R.id.imagebutton_stop);
        play = (ImageButton)findViewById(R.id.imagebutton_play);
        delete = (ImageButton)findViewById(R.id.imagebutton_delete);

        listView = (ListView)findViewById(R.id.listview01);
        textView = (TextView) findViewById(R.id.textview01);

        //设置状态按钮不可选
        stop.setEnabled(false);
        play.setEnabled(false);
        delete.setEnabled(false);
        //判断SD卡是不是插入
        sdCardExit = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
        if (sdCardExit){
            myRecAudioDir = Environment.getExternalStorageDirectory();

            //取得SD卡中的.amr文件
            getRecorderFiles();

            //取得SD Card目录里的所有.amr文件
            adapter = new ArrayAdapter(this,R.layout.item,recordFiles);

            //将ArrayAdapter添加进ListView对象中
            listView.setAdapter(adapter);
        }

单击录音按钮 首先创建录音音频文件 然后设置录音来源为麦克风 并修改文本的状态显示.

        record.setOnClickListener(new ImageButton.OnClickListener() {
            @Override
            public void onClick(View view) {

                try {

                    if (!sdCardExit){

                        Toast.makeText(MainActivity.this,"请插入SD Card",Toast.LENGTH_LONG).show();
                        return;
                    }

                    //创建录制音频对象
                    myRecAudioFile = File.createTempFile(strTempFile,".amr", myRecAudioDir);

                    mediaRecorder01 = new MediaRecorder();

                    //设置录音来源为麦克风
                    mediaRecorder01.setAudioSource(MediaRecorder.AudioSource.MIC);

                    mediaRecorder01.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);

                    mediaRecorder01.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);

                    mediaRecorder01.setOutputFile(myRecAudioFile.getAbsolutePath());

                    mediaRecorder01.prepare();

                    mediaRecorder01.start();

                    textView.setText("录音中...");

                    stop.setEnabled(true);

                    play.setEnabled(false);

                    delete.setEnabled(false);

                    isStopRecoder = false;

                }catch (Exception e){

                    e.printStackTrace();;

                }
            }
        });

设置单击停止按钮后的处理事件,先通过MediaRecorder.stop()停止录音,然后再将音频文件给Adapter。

        stop.setOnClickListener(new ImageButton.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (myRecAudioFile != null){

                    //停止录音
                    mediaRecorder01.stop();

                    mediaRecorder01.release();

                    mediaRecorder01 = null;

                    //将录音频文件名给Adapter
                    adapter.add(myRecAudioFile.getName());

                    textView.setText("停止:" + myRecAudioFile.getName());

                    stop.setEnabled(false);

                    isStopRecoder = true;
                }
            }
        });

设置单击播放按钮事件,单击之后会打开播放的程序.

        play.setOnClickListener(new ImageButton.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (myPlayFile != null && myPlayFile.exists()){
                    //打开播放的程序
                    openFile(myPlayFile);
                }
            }
        });

设置单击删除按钮的事件,想讲Adapter中的文件名称删除,然后删除存在的文件.

        delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                if (myPlayFile != null){

                    //先将Adapter删除文件名
                    adapter.remove(myPlayFile.getName());

                    //删除文件
                    if (myPlayFile.exists()){

                        myPlayFile.delete();

                        textView.setText("删除完成");
                    }

                }
            }
        });

ListView单击选项Item的时候的事件,当某选项被单击的时候,将播放和删除按钮 Enable 然后输出选择提示语句.

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view, int i, long l) {

                //某个选项被点击的时候 将删除与播放按钮Enable
                play.setEnabled(true);

                delete.setEnabled(true);

                myPlayFile  = new File(myRecAudioDir.getAbsolutePath()+File.separator
                +((TextView) view).getText());

                textView.setText("您选择的是:"+((TextView) view).getText());

            }
        });

下面是定义好的获取录制好的音频文件

    private void getRecorderFiles(){

        recordFiles = new ArrayList();

        if (sdCardExit){

            File files[] = myRecAudioDir.listFiles();

            if (files != null){

                for (int i = 0; i < files.length; i++){


                    if (files[i].getName().indexOf(".") >= 0){

                        //只取.amr文件
                        String fileS = files[i].getName().substring(files[i].getName().indexOf("."));

                        if (fileS.toLowerCase().equals(".amr"))

                            recordFiles.add(files[i].getName());
                    }

                }

            }
        }
    }


    //获取文件的类型
    private String getMIMEType(File f){

        String end = f.getName().substring(f.getName().lastIndexOf(".") + 1,f.getName().length()).toLowerCase();

        String type = "";

        if (end.equals("mp3") || end.equals("aac") || end.equals("amr") || end.equals("mpeg")|| end.equals("mp4")){

            type = "audio";

        }else if (end.equals("jpg") || end.equals("gif") || end.equals("png")|| end.equals("jpeg")){

            type = "image";

        }else {

            type = "*";
        }

        type += "/*";

        return type;

    }

定义openFile来打开播放指定的录音文件。

    private void openFile(File f){

        Intent intent = new Intent();

        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        intent.setAction(Intent.ACTION_VIEW);

        String type = getMIMEType(f);

        intent.setDataAndType(Uri.fromFile(f),type);

        startActivity(intent);
    }

此外,覆盖onStop方法来停止录音的操作。

    @Override
    protected void onStop() {

        if (mediaRecorder01 != null && !isStopRecoder){

            mediaRecorder01.stop();
            mediaRecorder01.release();
            mediaRecorder01 = null;
        }


        super.onStop();
    }

差点忘了一点事儿,权限 权限 权限。。。重要的事情说三遍。清单文件中添加:

    
    
    
    

以上功能完成以后,部署程序查看效果,一个简单的录音机功能程序就完成了。

你可能感兴趣的:(Android-实现一个简单的录音机功能程序)