热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android录音与播放功能的简单实例

这篇文章主要介绍了Android录音与播放功能的简单实例的相关资料,需要的朋友可以参考下

 Android 录音与播放功能的简单实例

最近在研究Android中一些常用的功能,像地图、拍照、录音和播放的实现等等,还有一些侧滑、动画等是如何实现的。
今天就把录音和播放的实现分享一下,录音和播放比较简单,利用android内部的类即可实现。

1、先看下运行后的界面:

以下三张图分别是进入、录音、播放时的。

 

2、Layout布局文件

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
   
 
   
 
     
 
     
 
      

3 Activity类

录音涉及到二个Activity,第一个Activity比较简单,我这里大概说下,其实就是有个按钮,点击后转移第二个Activity,录音返回后,在第一个Activity中获取录音的文件名、时长等。

第一个Activity部分代码:

 // 录音事件 
  ksly_btn.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
      Intent intent = new Intent(MaintainVisitEditActivity.this, AudioRecordActivity.class); 
      intent.setAction(Intent.ACTION_VIEW); 
      intent.putExtra("duration", entity.getVoiceDuration()); 
      intent.putExtra("fileName", entity.getVoiceRecord()); 
      startActivityForResult(intent, VOICE_RECODE); 
    } 
  }); 
 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
  super.onActivityResult(requestCode, resultCode, data); 
 
  if (requestCode == VOICE_RECODE && resultCode == AudioRecordActivity.SUCCESS) { 
    entity.setVoiceDuration(data.getLongExtra("duration", 0));// 时长 
    entity.setVoiceRecord(data.getStringExtra("fileName"));// 文件名(绝对路径) 
    ksly_time.setText(DateTimeUtils.formatToMillisecond(entity.getVoiceDuration())); 
  } 
} 

第二个Activity代码:

这里要注意一下,就是需要捕获返回键,处理一下,就是点击返回键时,也返回个状态码,以表示没有录音成功。

package com.whowii.ct.cm.activity; 
 
import java.io.File; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.Timer; 
import java.util.TimerTask; 
 
import android.app.Activity; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.Window; 
import android.widget.Button; 
import android.widget.TextView; 
import android.widget.Toast; 
 
import com.whowii.ct.cm.R; 
import com.whowii.ct.cm.command.QueryParams; 
import com.whowii.ct.cm.utils.DateTimeUtils; 
import com.whowii.ct.cm.utils.SDCardUtils; 
 
/** 
 * 录制音频 
 * 
 * @author Administrator 
 * 
 */ 
public class AudioRecordActivity extends Activity { 
  private TextView audio_record_time; 
  private Button audio_record_start, audio_record_stop, audio_record_play, audio_record_select; 
  private MediaRecorder mediaRecorder; 
  private final String TAG = AudioRecordActivity.class.getSimpleName(); 
  private boolean isIdle = true;// 当前是否空闲,false:表示正在录音 
  private long startTime = 0, stopTime = 0, duration = 0;// 开始时间、结束时间、录音时长 
  private String fileName = null;// 存储录音文件的路径 
  private Timer timer = null;// Timer计时器 
  public static final int SUCCESS = 1;// 录制成功; 
  public static final int FAILURE = 0;// 录制失败 
  private MediaPlayer mediaPlayer; 
  private TimerTask task = new TimerTask() { 
    final Handler handler = new Handler() { 
      public void handleMessage(Message message) { 
        Bundle data = message.getData(); 
        audio_record_time.setText(DateTimeUtils.formatToMillisecond(data.getLong("time"))); 
      } 
    }; 
 
    public void run() { 
      Message message = new Message(); 
      long t = System.currentTimeMillis(); 
      Bundle data = new Bundle(); 
      data.putLong("time", t - startTime); 
      message.setData(data); 
      handler.sendMessage(message); 
    } 
  }; 
 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); // 设置无标题栏 
 
    setContentView(R.layout.audio_record); 
    mediaPlayer = new MediaPlayer(); 
 
    initControl(); 
    setListener(); 
 
    timer = new Timer(true); 
    fileName = getIntent().getStringExtra("fileName"); 
    duration = getIntent().getLongExtra("duration", 0); 
  } 
 
  private void initControl() { 
    audio_record_time = (TextView) findViewById(R.id.audio_record_time); 
    audio_record_start = (Button) findViewById(R.id.audio_record_start); 
    audio_record_stop = (Button) findViewById(R.id.audio_record_stop); 
    audio_record_play = (Button) findViewById(R.id.audio_record_play); 
    audio_record_select = (Button) findViewById(R.id.audio_record_select); 
  } 
 
  private void setListener() { 
    // 播放完成事件 
    mediaPlayer.setOnCompletionListener(new OnCompletionListener() { 
      @Override 
      public void onCompletion(MediaPlayer mp) { 
        isIdle = true; 
        audio_record_play.setText("播放录音"); 
        audio_record_play.setBackgroundResource(R.drawable.searchinput_bg); 
      } 
    }); 
    // 开始录音 
    audio_record_start.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        if (!isIdle) { 
          return; 
        } 
        if (!SDCardUtils.sdCardExists()) { 
          Toast.makeText(AudioRecordActivity.this, "缺少SD卡,请先插入后再操作!", Toast.LENGTH_LONG).show(); 
          return; 
        } 
        audio_record_start.setText("开始录音"); 
        audio_record_start.setEnabled(true); 
 
        duration = 0; 
        startTime = System.currentTimeMillis(); 
        fileName = QueryParams.CACHE_AUDIO_PATH; 
        fileName += new SimpleDateFormat("yyyyMMdd_hhmmss").format(new Date(startTime)) + ".amr"; 
        File file = new File(fileName); 
 
        mediaRecorder = new MediaRecorder(); 
        mediaRecorder.setOutputFile(file.getAbsolutePath()); 
        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
        mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
        try { 
          mediaRecorder.prepare(); 
          mediaRecorder.start(); 
          isIdle = false; 
          audio_record_start.setBackgroundResource(R.drawable.searchbtn_pressed); 
          timer.schedule(task, 0, 100); 
        } catch (IOException e) { 
          startTime = 0; 
          Log.e(TAG, e.toString()); 
          Toast.makeText(AudioRecordActivity.this, "录制时发生异常!", Toast.LENGTH_LONG).show(); 
        } 
      } 
    }); 
    // 结束录音 
    audio_record_stop.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        if (mediaRecorder != null) { 
          stopTime = System.currentTimeMillis(); 
          duration = stopTime - startTime; 
          timer.cancel(); 
          mediaRecorder.stop(); 
          mediaRecorder.release(); 
          mediaRecorder = null; 
          audio_record_start.setBackgroundResource(R.drawable.searchbtn_normal); 
          isIdle = true; 
        } 
      } 
    }); 
    // 播放录音 
    audio_record_play.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        if (!isIdle) { 
          return; 
        } 
 
        if (audio_record_play.getText().equals("播放录音")) { 
          if (fileName == null || fileName.equals("") || duration == 0) { 
            Toast.makeText(AudioRecordActivity.this, "没有录音文件!", Toast.LENGTH_LONG).show(); 
            return; 
          } 
 
          try { 
            mediaPlayer.reset(); 
            mediaPlayer.setDataSource(fileName); 
            mediaPlayer.prepare(); 
            mediaPlayer.start(); 
            isIdle = false; 
            audio_record_play.setText("终止播放"); 
            audio_record_play.setBackgroundResource(R.drawable.searchbtn_pressed); 
          } catch (Exception e) { 
            e.printStackTrace(); 
            Toast.makeText(AudioRecordActivity.this, "播放录音时遇到错误!", Toast.LENGTH_LONG).show(); 
          } 
        } else { 
          if (mediaPlayer != null && mediaPlayer.isPlaying()) { 
            mediaPlayer.stop(); 
            isIdle = true; 
          } 
          audio_record_play.setText("播放录音"); 
          audio_record_play.setBackgroundResource(R.drawable.searchinput_bg); 
        } 
      } 
    }); 
    // 确认选择 
    audio_record_select.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        if (fileName == null || fileName.equals("") || duration == 0) { 
          Toast.makeText(AudioRecordActivity.this, "没有录音文件!", Toast.LENGTH_LONG).show(); 
          return; 
        } 
 
        Intent intent = new Intent(); 
        intent.putExtra("fileName", fileName); 
        intent.putExtra("duration", duration); 
        setResult(SUCCESS, intent);// 返回成功标识 
        isIdle = true; 
        if (mediaPlayer != null) { 
          if (mediaPlayer.isPlaying()) { 
            mediaPlayer.stop(); 
          } 
          mediaPlayer = null; 
        } 
        finish();// 结束当前的activity,等于点击返回按钮 
      } 
    }); 
  } 
 
  // 捕获返回键,关闭当前页面时返回失败标识 
  @Override 
  public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 
      setResult(FAILURE); 
      isIdle = true; 
      if (mediaPlayer != null) { 
        if (mediaPlayer.isPlaying()) { 
          mediaPlayer.stop(); 
        } 
        mediaPlayer = null; 
      } 
      finish(); 
      return true; 
    } 
    return super.onKeyDown(keyCode, event); 
  } 
 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文讲述了作者通过点火测试男友的性格和承受能力,以考验婚姻问题。作者故意不安慰男友并再次点火,观察他的反应。这个行为是善意的玩人,旨在了解男友的性格和避免婚姻问题。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Android系统移植与调试之如何修改Android设备状态条上音量加减键在横竖屏切换的时候的显示于隐藏
    本文介绍了如何修改Android设备状态条上音量加减键在横竖屏切换时的显示与隐藏。通过修改系统文件system_bar.xml实现了该功能,并分享了解决思路和经验。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
author-avatar
风过无痕啦啦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有