Android--实现自制录音/播放录音程序

这篇博客介绍了如何在Android平台上实现录音和播放功能,包括主程序代码、权限设置,并展示了录音文件在ListView中的显示。此外,文章还提到了Markdown编辑器的新特性,如界面设计、代码高亮、图片拖拽、KaTeX数学公式等,增强了写作和展示体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

首先,让我们先看下实现的截图:


当有录音文件存在时,会显示在下面的ListView当中。

下面给出实现的完整代码:

1.主程序代码

package irdc.ex07_11;import java.io.File;import java.io.IOException;import java.util.ArrayList;import android.app.Activity;import android.content.Intent;import android.media.MediaRecorder;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.CheckedTextView;import android.widget.ImageButton;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class EX07_11 extends Activityprivate ImageButton myButton1;  private ImageButton myButton2;  private ImageButton myButton3;  private ImageButton myButton4;  private ListView myListView1;  private String strTempFile = "ex07_11_"private File myRecAudioFile;  private File myRecAudioDir;  private File myPlayFile;  private MediaRecorder mMediaRecorder01;  private ArrayList<String> recordFiles;  private ArrayAdapter<String> adapter;  private TextView myTextView1;  private boolean sdCardExit;  private boolean isStopRecord;  /** Called when the activity is first created. */  @Override  public void onCreate(Bundle savedInstanceState)  {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    myButton1 = (ImageButton) findViewById(R.id.ImageButton01);    myButton2 = (ImageButton) findViewById(R.id.ImageButton02);    myButton3 = (ImageButton) findViewById(R.id.ImageButton03);    myButton4 = (ImageButton) findViewById(R.id.ImageButton04);    myListView1 = (ListView) findViewById(R.id.ListView01);    myTextView1 = (TextView) findViewById(R.id.TextView01);    myButton2.setEnabled(false);    myButton3.setEnabled(false);    myButton4.setEnabled(false);    /* 判断SD Card是否插入 */    sdCardExit = Environment.getExternalStorageState().equals(        android.os.Environment.MEDIA_MOUNTED);    /* 取得SD Card路径做为录音的文件位置 */    if (sdCardExit)      myRecAudioDir = Environment.getExternalStorageDirectory();    /* 取得SD Card目录里的所有.amr文件 */    getRecordFiles();    adapter = new ArrayAdapter<String>(this,        R.layout.my_simple_list_item, recordFiles);    /* 将ArrayAdapter存入ListView对象中 */    myListView1.setAdapter(adapter);    /* 录音 */    myButton1.setOnClickListener(new ImageButton.OnClickListener()    {      @Override      public void onClick(View arg0)      {        try        {          if (!sdCardExit)          {            Toast.makeText(EX07_11.this, "请插入SD Card",                Toast.LENGTH_LONG).show();            return;          }          /* 建立录音档 */          myRecAudioFile = File.createTempFile(strTempFile, ".amr",              myRecAudioDir);          mMediaRecorder01 = new MediaRecorder();          /* 设定录音来源为麦克风 */          mMediaRecorder01              .setAudioSource(MediaRecorder.AudioSource.MIC);          mMediaRecorder01              .setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);          mMediaRecorder01              .setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);          mMediaRecorder01.setOutputFile(myRecAudioFile              .getAbsolutePath());          mMediaRecorder01.prepare();          mMediaRecorder01.start();          myTextView1.setText("录音中");          myButton2.setEnabled(true);          myButton3.setEnabled(false);          myButton4.setEnabled(false);          isStopRecord = false;        } catch (IOException e)        {          // TODO Auto-generated catch block          e.printStackTrace();        }      }    });    /* 停止 */    myButton2.setOnClickListener(new ImageButton.OnClickListener()    {      @Override      public void onClick(View arg0)      {        // TODO Auto-generated method stub        if (myRecAudioFile != null)        {          /* 停止录音 */          mMediaRecorder01.stop();          /* 将录音文件名给Adapter */          adapter.add(myRecAudioFile.getName());          mMediaRecorder01.release();          mMediaRecorder01 = null;          myTextView1.setText("停止:" + myRecAudioFile.getName());          myButton2.setEnabled(false);          isStopRecord = true;        }      }    });    /* 播放 */    myButton3.setOnClickListener(new ImageButton.OnClickListener()    {      @Override      public void onClick(View arg0)      {        // TODO Auto-generated method stub        if (myPlayFile != null && myPlayFile.exists())        {          /* 开启播放的程序 */          openFile(myPlayFile);        }      }    });    /* ?除 */    myButton4.setOnClickListener(new ImageButton.OnClickListener()    {      @Override      public void onClick(View arg0)      {        // TODO Auto-generated method stub        if (myPlayFile != null)        {          /* 因将Adapter移除文件名 */          adapter.remove(myPlayFile.getName());          /* 删除文件 */          if (myPlayFile.exists())            myPlayFile.delete();          myTextView1.setText("完成删除");        }      }    });    myListView1.setOnItemClickListener(new AdapterView.OnItemClickListener()        {          @Override          public void onItemClick(AdapterView<?> arg0, View arg1,              int arg2, long arg3)          {            /* 当有点选文件名时将删除及播放按钮Enable */            myButton3.setEnabled(true);            myButton4.setEnabled(true);            myPlayFile = new File(myRecAudioDir.getAbsolutePath()                + File.separator                + ((CheckedTextView) arg1).getText());            myTextView1.setText("你选的是:"                + ((CheckedTextView) arg1).getText());          }        });  }  @Override  protected void onStop()  {    if (mMediaRecorder01 != null && !isStopRecord)    {      /* 停止录音 */      mMediaRecorder01.stop();      mMediaRecorder01.release();      mMediaRecorder01 = null;    }    super.onStop();  }  private void getRecordFiles()  {    recordFiles = new ArrayList<String>();    if (sdCardExit)    {      File files[] = myRecAudioDir.listFiles();      if (files != null)      {        for (int i = 0; i < files.length; i++)        {          if (files[i].getName().indexOf(".") >= 0)          {            /* 读取.amr文件 */            String fileS = files[i].getName().substring(                files[i].getName().indexOf("."));            if (fileS.toLowerCase().equals(".amr"))              recordFiles.add(files[i].getName());          }        }      }    }  }  /* 开启播放录音文件的程序 */  private void openFile(File f)  {    Intent intent = new Intent();    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    intent.setAction(android.content.Intent.ACTION_VIEW);    String type = getMIMEType(f);    intent.setDataAndType(Uri.fromFile(f), type);    startActivity(intent);  }  private String getMIMEType(File f)  {    String end = f.getName().substring(        f.getName().lastIndexOf(".") + 1, f.getName().length())        .toLowerCase();    String type = "";    if (end.equals("mp3") || end.equals("aac") || end.equals("aac")        || end.equals("amr") || end.equals("mpeg")        || end.equals("mp4"))    {      type = "audio";    } else if (end.equals("jpg") || end.equals("gif")        || end.equals("png") || end.equals("jpeg"))    {      type = "image";    } else    {      type = "*";    }    type += "/*";    return type;  }}

2.总体布局文件代码

<?xml version="1.0" encoding="utf-8"?><LinearLayout   xmlns:android="http://schemas.android.com/apk/res/android"  android:orientation="vertical"  android:layout_width="fill_parent"  android:layout_height="fill_parent"   android:background="@drawable/white">  <LinearLayout   android:id="@+id/LinearLayout01"   android:layout_width="wrap_content"   android:layout_height="wrap_content">  <ImageButton   android:id="@+id/ImageButton01"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:src="@drawable/record">  </ImageButton>  <ImageButton   android:id="@+id/ImageButton02"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:src="@drawable/stop">  </ImageButton>  <ImageButton   android:id="@+id/ImageButton03"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:src="@drawable/play">  </ImageButton>  <ImageButton   android:id="@+id/ImageButton04"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:src="@drawable/delete">  </ImageButton>  </LinearLayout>  <TextView   android:id="@+id/TextView01"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:textColor="@drawable/black">  </TextView>  <ListView   android:id="@+id/ListView01"   android:layout_width="wrap_content"   android:layout_height="wrap_content"   android:background="@drawable/black">  </ListView></LinearLayout>

3.ListView中的子View的布局

<?xml version="1.0" encoding="utf-8"?> <CheckedTextView   xmlns:android="http://schemas.android.com/apk/res/android"   android:id="@+id/myCheckedTextView1"   android:layout_width="fill_parent"   android:layout_height="fill_parent"   android:textColor="@drawable/white"/> 

4.除了这些,我们还需要加入读取Sd的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>


           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block var foo = 'bar'; 

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 现有任务
        已完成               :done,    des1, 2014-01-06,2014-01-08
        进行中               :active,  des2, 2014-01-09, 3d
        计划一               :         des3, after des2, 5d
        计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值