录制音频和在手机系统中获取音频
<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()
录制音频和在手机系统中获取音频相关推荐
- android 音频播放过程,一种Android系统中的音频播放方法与流程
本申请涉及android系统技术,特别涉及一种android系统中的音频播放方法. 背景技术: 在android系统中,现有的使用audiotrack进行音频播放时,audiotrack应用与andr ...
- adb shell 小米手机_【转】【Android测试技巧】01. root后adb shell默认不是root用户时,如何将文件放入手机系统中...
http://blog.csdn.net/wirelessqa/article/details/8624208 有些机器root后通过adb shell 后,默认不是root用户,需要输入 su才能切 ...
- 【Android测试技巧】01. root后adb shell默认不是root用户时,如何将文件放入手机系统中
有些机器root后通过adb shell 后,默认不是root用户,需要输入 su才能切换到root,这样在执行批处理或想将文件放到手机系统中会有问题: 方法一:命令行 1 adb shell &qu ...
- QT中QDatetime中文系统中获取英文系统的结果
QT中QDatetime中文系统中获取英文系统的结果 如需转载请标明出处:http://blog.csdn.net/itas109 QQ技术交流群:129518033 我们在中文系统下开发QT程序,如 ...
- Linux系统中获取临时文件路径 `GetTempPath`和`GetTempFileName`函数
Linux系统中获取临时文件路径 为了在Linux系统中获得WIN API的GetTempPath和GetTempFileName函数的功能,我们要在Linux下实现这两个函数. GetTempPat ...
- android获取小程序音频时长,微信小程序获取音频时长与实时获取播放进度
首先在没有播放音频之前,居然拿不到总时长 但是在播放之后也需要设置setTimeout来获取 所以在监听音频播放进度更新事件中获取.顺便获取当前播放进度 按照官方的写法 audioPlayed: fu ...
- 获取android com包名,Android系统中获取进程(和顶端包名)
概要: android L前我们可以使用 getRunningTasks(int maxNum) maxNum int: The maxNumnumber of entries to return i ...
- 手机中geetest是什么文件_安卓手机系统中各类英文文件夹的含义详解,不知道的尽快熟知!...
说到手机,不管是安卓版还是苹果版的手机,总是会有很多地方让人头疼,不是因为不好用,而是因为不认识,完全不知道干嘛用的.看来使用手机,还需要将自己的英文学好,这样才不会导致自己的手机内存不够用和误删除一 ...
- 获取Linux的方法,CDN Linux系统中获取LDNS的方法
在Linux命令行模式下,可通过以下方式获取: 方法一: curl -s http://13491234.testns.cdnunion.net/?callback? testns前面的数字输入一个随 ...
最新文章
- new Scanner(1.txt);读取不到文件中的数据
- Vue安装npm长时间停留WARN deprecated request@2.88.2: request has been deprecated
- 【SSL】SSL工作原理
- arm b bl 地址无关码_32位和64位下的arm_pwn初探
- openstack havana vlan安装成功
- java hbase流量日志,Spark+Hbase 亿级流量分析实战(日志存储设计)
- 基于 MVP+RxJava2+Retrofit2 的应用—熊猫眼
- Android开源项目库汇总
- matlab设置图片背景透明_[转载]Matlab中得到透明背景图片的方法
- 安全中心服务器已关闭啥意思,启用windows安全中心服务是什么意思,windows安全中心服务关闭方法...
- 微信的用户已退出是什么意思_微信版本更新,朋友圈能评论表情包了?安卓用户已退出群聊...
- 万能解压器安卓版_全能压缩app下载 全能压缩(手机解压软件) for Android v11.5 安卓版 下载-脚本之家...
- 深度学习平台——百度AI Studio线上构建
- 赫夫曼压缩(萌新劝退)
- python批量打印mathcad_快速批量打印软件 – Print Conductor 6.1
- Problem C: 算法4-6:KMP字符串模式匹配算法实现
- 第一台生物计算机,我国研制成功第一台生物计算机
- PTA 6-1 在数组中查找指定元素 (25分)
- 可生成彩色网格SVG背景的js插件
- 获取屏幕大小 android,Android获取屏幕大小