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