录制音频和在手机系统中获取音频
2015-12-21 16:13
686 查看
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">这里有两种获取音频的方式:</span>
1.录音保存获取音频
点击开始录音按钮之后的开始录音,设置录音的状态,已经设置stop按钮停止录音按钮可以点击
/* **************************************************************** * * 开始录音 */ private void startAudio() { // 创建录音频文件 // 这种创建方式生成的文件名是随机的 fileAudioName = "audio" + GetSystemDateTime.now() + StringTools.getRandomString(2) + ".mp3"; mediaRecorder = new MediaRecorder(); // 设置录音的来源为麦克风 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); mediaRecorder.setOutputFile(filePath + "/" + fileAudioName); try { mediaRecorder.prepare(); mediaRecorder.start(); textViewLuYinState.setText("录音中。。。"); fileAudio = new File(filePath + "/" + fileAudioName); buttonStart.setEnabled(false); buttonStop.setEnabled(true); listViewAudio.setEnabled(false); isLuYin = true; } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
然后录音有两种结束方式,一种是倒计时结束自动结束,一种是点击停止按钮停止录音
按钮点击
// 停止按钮 buttonStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(LuYinActivity.this, "录音时间到", Toast.LENGTH_SHORT).show(); <span style="white-space:pre"> </span>timedown.stop(); stopAudion(); rcChat_popup.setVisibility(View.GONE); timedown.setVisibility(View.GONE); } });
调用的stopAudion方法,在listView中添加文件显示,更新listView同时更新数据库。
/* ****************************************************** * * 停止录制 */ private void stopAudion() { if (null != mediaRecorder) { mHandler.removeCallbacks(mPollTask); // 停止录音 mediaRecorder.stop(); mediaRecorder.release(); mediaRecorder = null; textViewLuYinState.setText("录音停止了"); // 开始键能够按下 buttonStart.setEnabled(true); buttonStop.setEnabled(false); listViewAudio.setEnabled(true); String filePath_adapter = filePath + "/" + fileAudioName; addItem(fileAudioName,filePath_adapter); adapter.notifyDataSetChanged(); volume.setImageResource(R.drawable.amp1); } }另一种,倒计时结束自动结束,Chronometer用来显示倒计时,Chronometer是一个控件,每一秒自动刷新
private void initTimer(long total) { this.timeTotalInS = total; this.timeLeftInS = total; timedown.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() { @Override public void onChronometerTick(Chronometer chronometer) { if (timeLeftInS <= 0) { Toast.makeText(LuYinActivity.this, "录音时间到", Toast.LENGTH_SHORT).show(); timedown.stop(); //录音停止 stopAudion(); rcChat_popup.setVisibility(View.GONE); timedown.setVisibility(View.GONE); return; } timeLeftInS--; refreshTimeLeft(); } }); }
结束之后自动保存到之前初始化的地址:mediaRecorder.setOutputFile(filePath + "/" + fileAudioName);
2.在手机中扫描获取音频然后添加到自己的数据库,由数据库中设置歌单的方式读出来
点击from_file然后跳转Activity:
public void getFiles(){ if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ Toast.makeText(this, "暂无外部存储", Toast.LENGTH_SHORT).show(); return; } new Thread(new Runnable() { @Override public void run() { Uri mImageUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; ContentResolver mContentResolver = SearchMP3.this.getContentResolver(); Cursor mCursor = getContentResolver().query( MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.MediaColumns.TITLE); while (mCursor.moveToNext()) { //获取文件的路径 String filePath = mCursor.getString(mCursor .getColumnIndex(MediaStore.Audio.AudioColumns.DATA)); //获取文件的标题 String fileTitle = mCursor.getString(mCursor .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE)); //获取该文件的时间 String fileTime = mCursor.getString(mCursor .getColumnIndex(MediaStore.Audio.AudioColumns.TITLE)); long modify = mCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATE_MODIFIED); int isMusic = mCursor.getInt(mCursor .getColumnIndex(MediaStore.Audio.Media.IS_MUSIC)); // 是否为音乐 if (isMusic!=0) { Map<String, String> map = new HashMap<String, String>(); map.put("fileTitle", fileTitle); map.put("filePath", filePath); map.put("fileTime", fileTime); mGruopMap.put(filePath, map); } else { //如果已经扫描过。。。。。不做处理 } } mCursor.close(); //通知Handler扫描图片完成 mHandler.sendEmptyMessage(SCAN_OK); } }).start(); }
/** * 组装分组界面listView的数据源,因为我们扫描手机的时候将图片信息放在HashMap中 * 所以需要遍历HashMap将数据组装成List * * @param mGruopMap * @return */ private List<FileBean> makeFileList(HashMap<String, Map<String, String>> mGruopMap){ if(mGruopMap.size() == 0){ return null; } List<FileBean> list = new ArrayList<FileBean>(); Iterator<Map.Entry<String, Map<String, String>>> it = mGruopMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry<String, Map<String, String>> entry = it.next(); FileBean mFileBean = new FileBean(); String key = entry.getKey(); Map<String, String> map = entry.getValue(); mFileBean.setFilePath(map.get("filePath")); mFileBean.setFileTime(map.get("fileTime")); mFileBean.setFileTitle(map.get("fileTitle")); list.add(mFileBean); } return list; }listview的自定义adapter:更新"确定(1)"括号里面的数字
package com.monkeylluffy.recorder; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.w3c.dom.Text; import com.monkeylluffy.recorder.tools.FileBean; import com.nineoldandroids.animation.AnimatorSet; import com.nineoldandroids.animation.ObjectAnimator; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.CheckBox; import android.widget.Checkable; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.TextView; public class AddFileAdapter extends BaseAdapter{ private List<FileBean> list; protected LayoutInflater mInflater; private TextView textView; public AddFileAdapter(Context context,List<FileBean> list,TextView textView){ this.list = list; this.mInflater = LayoutInflater.from(context); this.textView = textView; } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int position) { // TODO Auto-generated method stub return list.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(final int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub final ViewHolder viewHolder; FileBean mFileBean = list.get(position); String path = mFileBean.getFilePath(); if(convertView == null){ viewHolder = new ViewHolder(); convertView = mInflater.inflate(R.layout.additem, null); viewHolder.mTextViewPath = (TextView) convertView.findViewById(R.id.filePath); viewHolder.mTextViewTitle = (TextView) convertView.findViewById(R.id.fileTitle); viewHolder.mChoose = (CheckBox) convertView.findViewById(R.id.filechoose); convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.mTextViewTitle.setText(mFileBean.getFileTitle()); viewHolder.mTextViewPath.setText(mFileBean.getFilePath()); viewHolder.mChoose.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub if(!mSelectMap.containsKey(position) || !mSelectMap.get(position)){ addAnimation(viewHolder.mChoose); } mSelectMap.put(position, isChecked); textView.setText("确定("+getSelectItems().size()+")"); } }); viewHolder.mChoose.setChecked(mSelectMap.containsKey(position) ? mSelectMap.get(position) : false); return convertView; } /** * 获取选中的Item的position * @return */ public List<Integer> getSelectItems(){ List<Integer> list = new ArrayList<Integer>(); for(Iterator<Map.Entry<Integer, Boolean>> it = mSelectMap.entrySet().iterator(); it.hasNext();){ Map.Entry<Integer, Boolean> entry = it.next(); if(entry.getValue()){ list.add(entry.getKey()); } } return list; } /** * 给CheckBox加点击动画,利用开源库nineoldandroids设置动画 * @param view */ private void addAnimation(View view){ float [] vaules = new float[]{0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f, 1.1f, 1.2f, 1.3f, 1.25f, 1.2f, 1.15f, 1.1f, 1.0f}; AnimatorSet set = new AnimatorSet(); set.playTogether(ObjectAnimator.ofFloat(view, "scaleX", vaules), ObjectAnimator.ofFloat(view, "scaleY", vaules)); set.setDuration(150); set.start(); } private HashMap<Integer, Boolean> mSelectMap = new HashMap<Integer, Boolean>(); public static class ViewHolder{ public TextView mTextViewTitle; public TextView mTextViewPath; public CheckBox mChoose; } }
点击确定:通过adpter中返回的position,将这几个的数据添加到数据库中,然后在页面读出来:
title_right.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //添加数据库,跳转参数的设置 Toast.makeText(SearchMP3.this, "选中 " + adapter.getSelectItems().size() + " item", Toast.LENGTH_LONG).show(); List<Integer> theList = adapter.getSelectItems(); db = myDBHelper.getWritableDatabase(); for (int i = 0; i < theList.size(); i++) { FileBean fileBean = list.get(theList.get(i)); ContentValues values1 = new ContentValues(); values1.put("filePath", fileBean.getFilePath()); values1.put("fileName", fileBean.getFileTitle()); //参数依次是:表名,强行插入null值得数据列的列名,一行记录的数据 db.insert("songlist", null, values1); Toast.makeText(SearchMP3.this, "插入完毕~", Toast.LENGTH_SHORT).show(); } Intent intent = new Intent(SearchMP3.this,LuYinActivity.class); startActivity(intent); } });
//此处有几处瑕疵,晚上修改,xml明天上传
1.在添加时没有避免列表中已经有的就不在扫描出来
2.在点击确定的时候,应该做的是finish(),用startResultActivity和setResult()
相关文章推荐
- struts2框架入门示例
- java 常见的异常大集合
- mac 用 brew
- UVA 10763
- Java NIO
- 学习springMVC 01
- 企业级 布署 vmvare Esxi 5.0.0 从零开始教程 (二) vSphere clinet 安装
- 企业级 布署 vmvare Esxi 5.0.0 从零开始教程 (二) vSphere clinet 安装
- ViewPager的使用和无限滚动的实现
- XML:Stax操作XML(基于光标的方式、迭代的方式、XPath的方式)
- 什么是内存溢出与内存泄露,几种常见导致内存泄露的写法
- 轻量级JavaEE企业应用实战(十二)
- 苹果App部署HTTPS进行在线下载安装
- eclipse svn插件 设置自动加锁相关
- 百度云_分享
- (转)如果知道dll文件是面向32位系统还是面向64位系统的?
- 期末总结
- 利用Queue库实现python进程间通讯
- C 语言 Signal 函数
- 2014级数据结构课程总结全链接