一个基于MedioRecorder的安卓录音软件【笔记】

先看效果图:



源代码:

package com.android.recordaudiodemo;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;

import android.media.MediaRecorder;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 
 * 一个基于MedioRecorder的录音软件
 * 
 * @author Administrator
 * 
 */
public class MainActivity extends Activity implements OnClickListener,
		OnItemClickListener, OnItemLongClickListener {

	// 声明控件
	private Button recordButton, stopButton;
	private TextView textView, nameText;
	private ListView listView;
	private ImageView imageView;

	// 声明MediaRecorder对象
	private MediaRecorder mediaRecorder;
	private File savePath; // 录音文件存储的文件路径
	private ArrayList<HashMap<String, Object>> audioList = new ArrayList<HashMap<String, Object>>(); // 录音文件列表

	private String recordFilePre = "record_"; // 录音文件前缀
	private File recordFile; // 录音文件
	private SimpleAdapter simpleAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		recordButton = (Button) findViewById(R.id.record);
		stopButton = (Button) findViewById(R.id.stop);
		textView = (TextView) findViewById(R.id.text);
		listView = (ListView) findViewById(R.id.list);
		imageView = (ImageView) findViewById(R.id.img);

		// 点击按钮
		recordButton.setOnClickListener(this);
		stopButton.setOnClickListener(this);
		// listView.setOnItemClickListener(this);
		listView.setOnItemLongClickListener(this);

		// 判断是否存在SD卡
		boolean sdCardDir = Environment.getExternalStorageState().equals(
				android.os.Environment.MEDIA_MOUNTED);
		if (sdCardDir) {
			// 设置录音文件的存储路径
			savePath = Environment.getExternalStorageDirectory();
		} else {
			Toast.makeText(MainActivity.this, "没有找到SD卡", Toast.LENGTH_SHORT)
					.show();
		}
		// 加载录音文件列表
		getRecordList();
	}

	/* 创建录音文件列表 */
	private void getRecordList() {
		// TODO Auto-generated method stub
		if (savePath.listFiles(new AudioFilter()).length > 0) {
			for (int i = 0; i < savePath.listFiles(new AudioFilter()).length; i++) {
				HashMap<String, Object> audioMap = new HashMap<String, Object>();
				audioMap.put("name",
						savePath.listFiles(new AudioFilter())[i].getName());
				audioMap.put("size",
						getLenght(savePath.listFiles(new AudioFilter())[i].length()));
				audioList.add(audioMap);
			}
		}
		// 适配器
		simpleAdapter = new SimpleAdapter(MainActivity.this, audioList,
				R.layout.item, new String[] { "name", "size" }, new int[] {
						R.id.fileName, R.id.fileSize });
		listView.setAdapter(simpleAdapter);
	}

	// 按钮点击事件
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub

		switch (v.getId()) {
		case R.id.record:
			try {
				if (mediaRecorder == null) {
					textView.setText("Start recording...");
					imageView.setImageResource(R.drawable.rec_bg2);
					// 实例化MediaRecorder对象
					mediaRecorder = new MediaRecorder();
					// 创建录音文件
					recordFile = File.createTempFile(recordFilePre, ".amr",
							savePath);
					// 设置麦克风
					mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
					// 设置格式
					mediaRecorder
							.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
					// 设置编码
					mediaRecorder
							.setAudioEncoder(MediaRecorder.VideoEncoder.DEFAULT);
					// 设置输出路径
					mediaRecorder.setOutputFile(recordFile.getAbsolutePath());
					// 录音准备
					mediaRecorder.prepare();
					// 录音开始
					mediaRecorder.start();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			break;

		case R.id.stop:
			// 停止录音
			textView.setText("");
			imageView.setImageResource(R.drawable.rec_bg1);
			if (recordFile != null) {
				mediaRecorder.stop();
				// 将录音文件显示到列表
				HashMap<String, Object> map = new HashMap<String, Object>();
				map.put("name", recordFile.getName());
				map.put("size", getLenght(recordFile.length()));
				audioList.add(map);
				simpleAdapter = new SimpleAdapter(MainActivity.this, audioList,
						R.layout.item, new String[] { "name", "size" },
						new int[] { R.id.fileName, R.id.fileSize });
				listView.setAdapter(simpleAdapter);

				mediaRecorder.release();
				mediaRecorder = null;
				recordFile = null;
			} else {
				mediaRecorder = null;
			}
			break;
		}
	}

	// 列表点击事件
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		// TODO Auto-generated method stub
		nameText = (TextView) arg1.findViewById(R.id.fileName);
		playAudio(new File(savePath + File.separator + nameText.getText()));
	}

	// 列表长按事件
	@Override
	public boolean onItemLongClick(AdapterView<?> arg0, final View arg1,
			int arg2, long arg3) {
		// TODO Auto-generated method stub
		AlertDialog.Builder aBuilder = new AlertDialog.Builder(this);
		// aBuilder.setTitle("Prepar");
		aBuilder.setItems(new String[] { "Play", "Delete", "Delete All" },
				new DialogInterface.OnClickListener() {

					@Override
					public void onClick(DialogInterface dialog, int which) {
						// TODO Auto-generated method stub
						nameText = (TextView) arg1.findViewById(R.id.fileName);
						if (which == 0) {
							// 播放录音文件
							// nameText = (TextView)
							// arg1.findViewById(R.id.fileName);
							// sizeText = (TextView)
							// arg1.findViewById(R.id.fileSize);
							playAudio(new File(savePath + File.separator
									+ nameText.getText()));
						} else if (which == 1) {
							// 删除录音文件
							for (int i = 0; i < audioList.size(); i++) {
								if (nameText.getText().equals(
										audioList.get(i).get("name"))) {
									audioList.remove(i);
									new File(savePath + File.separator
											+ nameText.getText()).delete();
									break;
								}
							}
							listView.setAdapter(simpleAdapter);
						} else if (which == 2) {
							// 删除全部录音文件
							for (int i = 0; i < audioList.size(); i++) {
								new File(savePath + File.separator
										+ audioList.get(i).get("name"))
										.delete();
							}
							audioList.clear();
							listView.setAdapter(simpleAdapter);
						}
					}
				});
		aBuilder.create().show();
		return true;
	}

	/**
	 * 播放录音文件
	 * 
	 * @param file
	 */
	@SuppressWarnings("static-access")
	private void playAudio(File file) {
		Intent intent = new Intent();
		intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK);
		intent.setAction(android.content.Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(file), "audio");
		startActivity(intent);

	}
	
	/**
	 * 获取文件 长度
	 * 
	 * @param lenght
	 * @return
	 */
	public static String getLenght(long lenght) {
		DecimalFormat df = new DecimalFormat();
		df.setMaximumFractionDigits(2);
		df.setMinimumFractionDigits(0);
		if (lenght >= 1073741824) {
			return df.format((double) lenght / 1073741824) + "GB";
		} else if (lenght >= 1048576) {
			return df.format((double) lenght / 1048576) + "MB";
		} else if (lenght >= 1024) {
			return df.format((double) lenght / 1024) + "KB";
		} else {
			return df.format(lenght) + "B";
		}
	}

}

/**
 * 创建音频文件类型过滤器
 * 
 * @author Administrator
 * 
 */
class AudioFilter implements FilenameFilter {

	@Override
	public boolean accept(File dir, String filename) {
		// TODO Auto-generated method stub
		return filename.endsWith(".amr");
	}

}


需要注意的是:

1、layout有两个布局文件:activity_main.xml  item.xml

2、AndroidManifest.xml文件需要设置权限:

<!-- SD卡写权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 录音权限 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 

Demo源代码在这里: http://download.csdn.net/detail/bellovin/6671821

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴能回答您的问题,使用PyQt5框架编写笔记软件可以通过以下步骤实现: 1. 创建一个PyQt5应用程序,并设置窗口大小和标题。 2. 在窗口中添加文本框,用于输入文本。 3. 添加按钮,用于保存和打开文件。 4. 使用PyQt5的文件对话框,以便用户可以选择要保存或打开的文件。 5. 使用Python的open()函数来保存或打开文件。 6. 实现程序的其他功能,如搜索、撤销/重做等。 ### 回答2: 使用Pyqt5框架开发一个笔记软件可以实现以下功能: 1. 编辑笔记:用户可以创建新笔记,编辑现有笔记或删除不需要的笔记软件界面提供一个文本编辑器,用户可以在其中输入和修改文本内容,并且可以对文本进行格式化,如选择字体、字号、颜色等。 2. 分类和标签:用户可以对笔记进行分类和标签。分类可以根据不同主题或用途,如工作、学习、个人等进行分类管理。标签可以根据关键词进行添加和查找,方便用户整理和检索笔记。 3. 笔记管理:用户可以通过软件界面对笔记进行管理,可以对笔记进行重命名,设置笔记的创建日期和最后修改日期。还可以设置笔记的优先级、提醒和星标等属性,方便用户按照不同的需求对笔记进行排序和过滤。 4. 导入和导出:用户可以将已存在的笔记导入到软件中,或将软件中的笔记导出为其他格式,如文本文件、PDF文件等。这样用户可以方便地与其他人共享和传递笔记。 5. 数据备份和恢复:软件可以提供数据备份和恢复的功能,用户可以定期备份笔记数据,以防止数据丢失或损坏。当需要时,用户可以通过导入备份文件来恢复数据,确保笔记的安全性。 6. 用户界面个性化:软件界面可以提供用户个性化设置的功能,如选择不同的主题、布局和快捷键等,以满足不同用户的喜好和习惯。 通过利用PyQt5框架的丰富功能和灵活性,可以开发出一个功能齐全、易于使用的笔记软件,满足用户对笔记管理的需求。 ### 回答3: 使用PyQt5框架编写一个笔记软件可以提供一个用户友好的界面,方便用户记录、编辑和管理各种类型的笔记。 首先,我们可以使用PyQt5的QWidget作为主窗口,并设置合适的窗口大小。然后,可以在窗口中创建一个多页的标签栏,每个标签页代表一个笔记。 接下来,可以在每个标签页上添加适当的控件,如QTextEdit或QPlainTextEdit,以实现用户输入和编辑文本内容的功能。同时,可以提供一些按钮和菜单,例如保存、打开、剪切、复制和粘贴等,以增强用户的操作体验。 此外,还可以在界面中添加其他功能组件,如日历控件或待办事项列表,以满足用户不同的需求。例如,用户可以在软件中添加一些提醒事项,或者将某些笔记标记为重要,方便日后查看。 为了增强用户使用体验,可以在软件中设置一些快捷键,以方便用户快速完成常用操作,如Ctrl+S保存笔记,Ctrl+Z撤销等。 最后,可以为软件添加一个简洁美观的界面风格,以及一些自定义设置,如字体、颜色和背景等,以满足用户对个性化的需求。 综上所述,使用PyQt5框架编写一个笔记软件可以实现用户友好的界面和丰富的功能,提供便捷、高效的笔记记录和管理体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值