Android实现多媒体录音笔
程序员文章站
2023-12-20 14:55:58
记事本涉及到的仅仅是对string 的存储,而且在读取上并不存在什么难点,直接用textview显示便可以了。需要做的主要是使用sqlite对数据进行一个整理。
而录音笔...
记事本涉及到的仅仅是对string 的存储,而且在读取上并不存在什么难点,直接用textview显示便可以了。需要做的主要是使用sqlite对数据进行一个整理。
而录音笔需要考虑的就相对较多了:比如录音时中断,录音时用户点击播放按钮;未录音,用户点击停止按钮;在录音或者播放时关闭activity;listview的item中需要为button设置不同的点击效果等等。
为了便于新手学习,在此还是罗列一下涉及的主要知识点:
- 1、baseadapter
- 2、java的file
- 3、mediarecorder
- 4、较多的alertdialog
- 5、mediaplayer
遇到的问题:
在listview item中的button控件可以获得焦点时,直接为listview设置item长按事件的监听。出现了listview的item长按事件无效的情况。
解决方法:
直接在baseadapter中对该item的布局进行长按事件的监听(在笔者demo中是linearlayout),也就是说对item中button的父布局进行长按事件的监听。
效果:
mainactivity:
package com.example.recorder; import android.app.activity; import android.app.alertdialog; import android.app.alertdialog.builder; import android.content.dialoginterface; import android.media.mediaplayer; import android.media.mediarecorder; import android.os.bundle; import android.os.environment; import android.view.layoutinflater; import android.view.view; import android.view.view.onclicklistener; import android.view.viewgroup; import android.widget.adapterview; import android.widget.baseadapter; import android.widget.button; import android.widget.edittext; import android.widget.linearlayout; import android.widget.listview; import android.widget.textview; import android.widget.toast; import java.io.file; import java.io.ioexception; public class mainactivity extends activity implements onclicklistener { private button start; private button stop; private listview listview; showrecorderadpter showrecord; // 录音文件播放 // 录音 // 音频文件保存地址 private mediaplayer myplayer; private mediarecorder myrecorder = null; private string path; private file savefilepath; // 所录音的文件名 string[] listfile = null; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); //初始化控件 initview(); } private void initview() { start = (button) findviewbyid(r.id.start); stop = (button) findviewbyid(r.id.stop); listview = (listview) findviewbyid(r.id.list); myplayer = new mediaplayer(); showrecord = new showrecorderadpter(); //如果手机有sd卡 if (environment.getexternalstoragestate().equals( environment.media_mounted)) { try { path = environment.getexternalstoragedirectory() .getcanonicalpath().tostring() + "/myrecorders"; file files = new file(path); if (!files.exists()) { //如果有没有文件夹就创建文件夹 files.mkdir(); } listfile = files.list(); } catch (ioexception e) { e.printstacktrace(); } } start.setonclicklistener(this); stop.setonclicklistener(this); listview.setadapter(showrecord); } //由于在item中涉及到了控件的点击效果,所以采用baseadapter class showrecorderadpter extends baseadapter { @override public int getcount() { return listfile.length; } @override public object getitem(int arg0) { return arg0; } @override public long getitemid(int arg0) { return arg0; } @override public view getview(final int postion, view arg1, viewgroup arg2) { view views = layoutinflater.from(mainactivity.this).inflate( r.layout.list_item, null); linearlayout parent = (linearlayout) views.findviewbyid(r.id.list_parent); textview filename = (textview) views.findviewbyid(r.id.show_file_name); button plays = (button) views.findviewbyid(r.id.bt_list_play); button stop = (button) views.findviewbyid(r.id.bt_list_stop); //在textview中显示的时候把“.amr”去掉 filename.settext(listfile[postion].substring(0, listfile[postion].length() - 4)); parent.setonlongclicklistener(new view.onlongclicklistener() { @override public boolean onlongclick(view view) { alertdialog aler = new alertdialog.builder(mainactivity.this) .settitle("确定删除该录音?") .setpositivebutton("确定", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog , int which) { file file = new file(path + "/" + listfile[postion]); file.delete(); // 在删除文件后刷新文件名列表 file files = new file(path); listfile = files.list(); // 当文件被删除刷新listview showrecord.notifydatasetchanged(); } }) .setnegativebutton("取消", null) .create(); //设置不允许点击提示框之外的区域 aler.setcanceledontouchoutside(false); aler.show(); return false; } }); // 播放录音 plays.setonclicklistener(new onclicklistener() { @override public void onclick(view arg0) { //确认不是在录音的过程中播放 if (myrecorder == null) { try { myplayer.reset(); myplayer.setdatasource(path + "/" + listfile[postion]); if (!myplayer.isplaying()) { myplayer.prepare(); myplayer.start(); } else { myplayer.pause(); } } catch (ioexception e) { e.printstacktrace(); } } else { toast.maketext(mainactivity.this, "请不要再录音的过程中播放!", toast.length_short).show(); } } }); // 停止播放 stop.setonclicklistener(new onclicklistener() { @override public void onclick(view arg0) { if (myrecorder == null && myplayer.isplaying()) { myplayer.stop(); } } }); return views; } } @override public void onclick(view v) { switch (v.getid()) { case r.id.start: final edittext filename = new edittext(this); alertdialog aler = new builder(this) .settitle("请输入要保存的文件名") .setview(filename) .setpositivebutton("确定", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { string text = filename.gettext().tostring(); //如果文件名为空则跳出提示信息 if (text.equals("")) { toast.maketext(mainactivity.this, "请不要输入空的文件名!", toast.length_short).show(); } else { //开启录音 recorderstart(text); start.settext("正在录音中。。"); start.setenabled(false); stop.setenabled(true); // 在增添文件后刷新文件名列表 file files = new file(path); listfile = files.list(); // 当文件增加刷新listview showrecord.notifydatasetchanged(); } } }) .setnegativebutton("取消",null) .create(); //设置不允许点击提示框之外的区域 aler.setcanceledontouchoutside(false); aler.show(); break; case r.id.stop: myrecorder.stop(); myrecorder.release(); myrecorder = null; // 判断是否保存 如果不保存则删除 aler = new alertdialog.builder(this) .settitle("是否保存该录音") .setpositivebutton("确定", null) .setnegativebutton("取消", new dialoginterface.onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { savefilepath.delete(); // 在删除文件后刷新文件名列表 file files = new file(path); listfile = files.list(); // 当文件被删除刷新listview showrecord.notifydatasetchanged(); } }).create(); //设置不允许点击提示框之外的区域 aler.setcanceledontouchoutside(false); aler.show(); start.settext("录音"); start.setenabled(true); stop.setenabled(false); default: break; } } private void recorderstart(string text) { try { myrecorder = new mediarecorder(); // 从麦克风源进行录音 myrecorder.setaudiosource(mediarecorder.audiosource.default); // 设置输出格式 myrecorder.setoutputformat(mediarecorder.outputformat.default); // 设置编码格式 myrecorder.setaudioencoder(mediarecorder.audioencoder.default); string paths = path + "/" + text + ".amr"; savefilepath = new file(paths); myrecorder.setoutputfile(savefilepath.getabsolutepath()); myrecorder.prepare(); // 开始录音 myrecorder.start(); } catch (exception e) { e.printstacktrace(); } } @override protected void ondestroy() { super.ondestroy(); // 如果myplayer正在播放,那么就停止播放,并且释放资源 if (myplayer.isplaying()) { myplayer.stop(); myplayer.release(); } //如果myrecorder有内容(代表正在录音),那么就直接释放资源 if(myrecorder!=null) { myrecorder.release(); myplayer.release(); } } }
activity_main:
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".mainactivity"> <textview android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#000" android:padding="13dp" android:text="语音笔" android:textcolor="#fff" android:textsize="22sp" android:textstyle="bold" /> <listview android:id="@+id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:padding="10dp" ></listview> <linearlayout android:id="@+id/li1" android:padding="10dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <button android:id="@+id/start" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:textsize="20sp" android:text="开始录音" /> <button android:id="@+id/stop" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:enabled="false" android:textsize="20sp" android:text="停止录音" /> </linearlayout> </linearlayout>
list_item:
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp" android:id="@+id/list_parent" android:orientation="horizontal"> <textview android:id="@+id/show_file_name" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="文件名" android:textcolor="#000" android:textsize="20sp" /> <button android:id="@+id/bt_list_play" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="18sp" android:text="播放" /> <button android:id="@+id/bt_list_stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textsize="18sp" android:text="停止" /> </linearlayout>
以上就是本文的全部内容,希望对大家实现android软件编程有所帮助。