欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现多媒体录音笔

程序员文章站 2024-02-16 13:42:10
记事本涉及到的仅仅是对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的父布局进行长按事件的监听。

效果:

Android实现多媒体录音笔   

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软件编程有所帮助。