录制音频和在手机系统中获取音频

<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()







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值