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() ;//重新加载列表
         }

      }

    }

}

主界面
正在录音
录音结束
播放录音

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

<!-- 联网权限 -->  
    <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" />  

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值