当前位置: 移动技术网 > 移动技术>移动开发>Android > Android实现多媒体录音笔

Android实现多媒体录音笔

2019年07月24日  | 移动技术网移动技术  | 我要评论

记事本涉及到的仅仅是对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软件编程有所帮助。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网