Android 之 录音

参考了些资料,做了一个小demo,实现了录音,播放的功能,现在就贴上代码。
1 配置文件

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" >
    <TableRow >
        <ImageView  android:id="@+id/icon" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/ic_launcher" />
    <TextView  android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="25dp" />
        </TableRow>


</TableLayout>

这个布局很简单,就是需要显示的录音;

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" android:orientation="vertical" >
        <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content">
        <ImageButton  android:id="@+id/record" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/hey_1" />
        <ImageButton  android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/hey_9" />
    </LinearLayout>
    <TextView android:id="@+id/info" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="文字提示信息..." />
    <ListView  android:id="@+id/reclist" android:layout_width="match_parent" android:layout_height="wrap_content" />

</LinearLayout>

主布局也不复杂,两个imagebutton控制开始录音,停止录音;一个listview显示录音;一个textview来显示录音状态;

OK 主代码来啦!!


package tedu.cn.audiodemo;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class MainActivity extends Activity {
        //初始化各种变量
        private ImageButton record = null;
        private ImageButton stop = null;
        private TextView info = null;
        private ListView reclist = null;
        private SimpleAdapter simpleAdapter = null;
        private MediaRecorder mediaRecorder = null;
        private boolean sdisExists=false;// 判断sd卡是否存在
        private File recordAudioSaveFileDir = null; // 保存所有音频文件的文件夹
        private File recordAudioSaveFile = null;    // 每次保存音频文件的名称
        private String recordAudioSaveFileName = null;  // 每次保存音频文件的名称
        private String recDir = "mldnrec"; // 保存的目录名称
        private boolean isRecord = false ;  // 录音的标志
        private List<Map<String,Object>> recordFiles = null ;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initViews();
        // 如果存在则将状态给了sdcardExists属性
        if(sdisExists=Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            recordAudioSaveFileDir=new File(Environment.getExternalStorageDirectory().toString()+
                    File.separator+
                    recDir+File.separator////保存录音文件
                    );
            if (! recordAudioSaveFileDir.exists()) {
                recordAudioSaveFileDir.mkdirs();//// 创建文件夹
            }
        }
        stop.setEnabled(false);
        record.setOnClickListener(new RecordOnClickListenerImpl());
        stop.setOnClickListener(new StopOnClickListenerImpl());
        reclist.setOnItemClickListener(new OnItemClickListenerImpl()) ;
        getRecordFiles();
    }
    private class OnItemClickListenerImpl implements OnItemClickListener{

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // TODO Auto-generated method stub
            if (simpleAdapter.getItem(position) instanceof Map) {
                Map<?, ?> map = (Map<?, ?>) simpleAdapter
                        .getItem(position);//取出指定位置的内容
                Uri uri = Uri
                        .fromFile(new File(recordAudioSaveFileDir
                                .toString()
                                + File.separator
                                + map.get("filename")));//定义操作的Uri
                Intent intent = new Intent(Intent.ACTION_VIEW) ; //指定Action
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ;//增加标记
                intent.setDataAndType(uri, "audio/mp3") ;//设置数据播放的MIME
                startActivity(intent) ;//穷Activity
        }
        }
    }
    private void initViews() {
        // TODO Auto-generated method stub
        record=(ImageButton) findViewById(R.id.record);
        stop=(ImageButton) findViewById(R.id.stop);
        info=(TextView) findViewById(R.id.info);
        reclist=(ListView) findViewById(R.id.reclist);
    }
    private void getRecordFiles() {
        // TODO Auto-generated method stub
        recordFiles = new ArrayList<Map<String, Object>>();
        if(sdisExists) {    // 有sd卡存在
            File files [] = recordAudioSaveFileDir.listFiles() ;    // 列出目录中的文件
            Log.i("TAG", "--files--"+files);
            for (int x = 0; x < files.length; x++) {
                Map<String, Object> fileInfo = new HashMap<String, Object>();
                fileInfo.put("filename", files[x].getName()) ;
                recordFiles.add(fileInfo) ;//保存数据
            }
            simpleAdapter = new SimpleAdapter(MainActivity.this,
                    recordFiles, R.layout.recordfiles,
                    new String[] { "filename" }, new int[] { R.id.textView1 });
            reclist.setAdapter(simpleAdapter) ;//定义列表视图
        }
    }
    private class RecordOnClickListenerImpl implements OnClickListener{

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (sdisExists) {
                recordAudioSaveFileName=recordAudioSaveFileDir.toString()
                        + File.separator
                        + "MLDNRecord_"
                        + System.currentTimeMillis() + ".3gp";  // 每次的录音文件名称都不一样
                recordAudioSaveFile=new File(recordAudioSaveFileName);//取得保存路径
                mediaRecorder=new MediaRecorder();
                // 在进行录制之前必须配置若干个参数
                mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); // 音频来源是MIC
                mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//定义输出格式
                mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//定义音频编码
                mediaRecorder.setOutputFile(recordAudioSaveFileName);//定义输出文件
                try {   // 进入到就绪状态
                    mediaRecorder.prepare() ;
                } catch (Exception e) {
                    // Log.i("MyMediaRecorderDemo", e.toString()) ;
                }
                mediaRecorder.start() ; // 开始录音
                info.setText("正在录音中...") ;
                stop.setEnabled(true); // 停止录音按钮可以使用了
                record.setEnabled(false) ;//录音按钮禁用
                isRecord = true ;   // 正在录音
            }
        }

    }
    private class StopOnClickListenerImpl implements OnClickListener{

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(isRecord) {  // 正在录音
                mediaRecorder.stop() ;  // 停止
                mediaRecorder.release() ;   // 释放资源
                record.setEnabled(true) ;//录音按钮启用
                stop.setEnabled(false) ;//
                info.setText("录音结束,文件路径为:"
                        + recordAudioSaveFileName);
                getRecordFiles() ;//重新加载列表
         }

      }

    }

}

Android 之 录音_第1张图片
Android 之 录音_第2张图片
Android 之 录音_第3张图片
Android 之 录音_第4张图片

对喽,别忘记添加权限哦!!!

<!-- 联网权限 -->  
    <uses-permission android:name="android.permission.INTERNET" />  
    <!-- 往SDCard写入数据权限 -->  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <!-- 录音权限 -->  
    <uses-permission android:name="android.permission.RECORD_AUDIO" />  
    <!-- 在SDCard中创建与删除文件权限 -->  
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />  

希望能给大家一点帮助,感谢!

你可能感兴趣的:(android,媒体录音)