您的位置:首页 > 其它

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

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





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: