<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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

然后录音有两种结束方式,一种是倒计时结束自动结束,一种是点击停止按钮停止录音

按钮点击

     // 停止按钮buttonStop.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubToast.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() {@Overridepublic 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() {@Overridepublic 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;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubfinal 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() {@Overridepublic void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {// TODO Auto-generated method stubif(!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() {@Overridepublic 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()

录制音频和在手机系统中获取音频相关推荐

  1. android 音频播放过程,一种Android系统中的音频播放方法与流程

    本申请涉及android系统技术,特别涉及一种android系统中的音频播放方法. 背景技术: 在android系统中,现有的使用audiotrack进行音频播放时,audiotrack应用与andr ...

  2. adb shell 小米手机_【转】【Android测试技巧】01. root后adb shell默认不是root用户时,如何将文件放入手机系统中...

    http://blog.csdn.net/wirelessqa/article/details/8624208 有些机器root后通过adb shell 后,默认不是root用户,需要输入 su才能切 ...

  3. 【Android测试技巧】01. root后adb shell默认不是root用户时,如何将文件放入手机系统中

    有些机器root后通过adb shell 后,默认不是root用户,需要输入 su才能切换到root,这样在执行批处理或想将文件放到手机系统中会有问题: 方法一:命令行 1 adb shell &qu ...

  4. QT中QDatetime中文系统中获取英文系统的结果

    QT中QDatetime中文系统中获取英文系统的结果 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 我们在中文系统下开发QT程序,如 ...

  5. Linux系统中获取临时文件路径 `GetTempPath`和`GetTempFileName`函数

    Linux系统中获取临时文件路径 为了在Linux系统中获得WIN API的GetTempPath和GetTempFileName函数的功能,我们要在Linux下实现这两个函数. GetTempPat ...

  6. android获取小程序音频时长,微信小程序获取音频时长与实时获取播放进度

    首先在没有播放音频之前,居然拿不到总时长 但是在播放之后也需要设置setTimeout来获取 所以在监听音频播放进度更新事件中获取.顺便获取当前播放进度 按照官方的写法 audioPlayed: fu ...

  7. 获取android com包名,Android系统中获取进程(和顶端包名)

    概要: android L前我们可以使用 getRunningTasks(int maxNum) maxNum int: The maxNumnumber of entries to return i ...

  8. 手机中geetest是什么文件_安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!...

    说到手机,不管是安卓版还是苹果版的手机,总是会有很多地方让人头疼,不是因为不好用,而是因为不认识,完全不知道干嘛用的.看来使用手机,还需要将自己的英文学好,这样才不会导致自己的手机内存不够用和误删除一 ...

  9. 获取Linux的方法,CDN Linux系统中获取LDNS的方法

    在Linux命令行模式下,可通过以下方式获取: 方法一: curl -s http://13491234.testns.cdnunion.net/?callback? testns前面的数字输入一个随 ...

最新文章

  1. new Scanner(1.txt);读取不到文件中的数据
  2. Vue安装npm长时间停留WARN deprecated request@2.88.2: request has been deprecated
  3. 【SSL】SSL工作原理
  4. arm b bl 地址无关码_32位和64位下的arm_pwn初探
  5. openstack havana vlan安装成功
  6. java hbase流量日志,Spark+Hbase 亿级流量分析实战(日志存储设计)
  7. 基于 MVP+RxJava2+Retrofit2 的应用—熊猫眼
  8. Android开源项目库汇总
  9. matlab设置图片背景透明_[转载]Matlab中得到透明背景图片的方法
  10. 安全中心服务器已关闭啥意思,启用windows安全中心服务是什么意思,windows安全中心服务关闭方法...
  11. 微信的用户已退出是什么意思_微信版本更新,朋友圈能评论表情包了?安卓用户已退出群聊...
  12. 万能解压器安卓版_全能压缩app下载 全能压缩(手机解压软件) for Android v11.5 安卓版 下载-脚本之家...
  13. 深度学习平台——百度AI Studio线上构建
  14. 赫夫曼压缩(萌新劝退)
  15. python批量打印mathcad_快速批量打印软件 – Print Conductor 6.1
  16. Problem C: 算法4-6:KMP字符串模式匹配算法实现
  17. 第一台生物计算机,我国研制成功第一台生物计算机
  18. PTA 6-1 在数组中查找指定元素 (25分)
  19. 可生成彩色网格SVG背景的js插件
  20. 获取屏幕大小 android,Android获取屏幕大小

热门文章

  1. tkinter 模块的最强辅助模块 —— tkintertools(万字详解)
  2. 通信云江湖里的融云野望
  3. Win10 MicrosoftEdge的卸载和重装
  4. 烫金机要进一步提高和改善机器性能
  5. 【圣诞结】人生苦短,我用Python画圣诞树
  6. GPS漂移和定位不准确的解决办法
  7. 长沙学计算机知名沙大计教育,厉害了!梅沙未来学校获全国最佳STEM教育推进案例奖...
  8. 一份代码帮我赚了10万
  9. CentOS开机自动启动脚本
  10. 通过小三越位,彻底弄懂 https 原理本质(三)加密漏洞