美文网首页Android开发Android技术知识Android开发
Android-实现一个简单的录音机功能程序

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

作者: 见哥哥长高了 | 来源:发表于2019-07-20 16:21 被阅读2次

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

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

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/recorder"
            android:id="@+id/imagebutton_recorder"
            />
    
    
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/stop"
            android:id="@+id/imagebutton_stop"/>
    
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/play"
            android:id="@+id/imagebutton_play"/>
    
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/delete"
            android:id="@+id/imagebutton_delete"/>
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/textview01"
            android:text="随便显示点东西"
            android:textColor="#77ff0000"
            />
    
        <ListView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listview01">
    
    
        </ListView>
        
    </LinearLayout>
    

    我们在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<String> recordFiles;//文件
    
        private ArrayAdapter<String> 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<String>(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<String>();
    
            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();
        }
    

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

        <uses-permission-sdk-23 android:name="android.permission.RECORD_AUDIO"/>
        <uses-permission-sdk-23 android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
        <uses-permission-sdk-23 android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    

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

    相关文章

      网友评论

        本文标题:Android-实现一个简单的录音机功能程序

        本文链接:https://www.haomeiwen.com/subject/mkdulctx.html