Android 开发之录音与播放
2017-09-30 10:57
351 查看
项目中可能有这样的需求:就是录音留言。今天针对这个写了这篇博客。
效果图:
文末会贴出项目下载地址,可以前去下载。。。
1,添加权限
2,看布局文件
3,逻辑代码(代码中,有相应的注释)
项目地址:RecordDemo
效果图:
文末会贴出项目下载地址,可以前去下载。。。
1,添加权限
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.VIBRATE" />
2,看布局文件
<?xml version="1.0" encoding="utf-8"?> <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:gravity="center" android:orientation="horizontal" android:background="@drawable/main_layout_bg" tools:context="com.gyq.recorddemo.MainActivity"> <Button android:id="@+id/btn_voice_reset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/icon_rerecord_nor" android:textColor="#ffffff" android:textSize="18sp" android:text="重录"/> <LinearLayout android:id="@+id/ll_recording" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:layout_marginLeft="20dp" android:orientation="vertical"> <ImageView android:id="@+id/iv_voice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon_record_nor"/> <Chronometer android:id="@+id/chr_timer" android:layout_marginTop="8dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16sp" android:textColor="#ff0000"/> <TextView android:id="@+id/tv_click_status" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="12dp" android:textSize="18sp" android:textColor="#ffffff" android:text="点击开始录音"/> </LinearLayout> <Button android:id="@+id/btn_voice_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:background="@drawable/icon_clean_nor" android:textColor="#ffffff" android:textSize="18sp" android:text="清除"/> </LinearLayout>
3,逻辑代码(代码中,有相应的注释)
package com.gyq.recorddemo; import android.media.MediaPlayer; import android.media.MediaRecorder; import android.os.Bundle; import android.os.Environment; import android.os.SystemClock; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Chronometer; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import java.io.File; import java.io.IOException; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private LinearLayout mRecord; private ImageView mVoice; private TextView mStatus; private Chronometer mTimer; private File mRecAudioFile; // 录制的音频文件 private File mRecAudioPath; // 录制的音频文件路徑 private MediaRecorder mMediaRecorder;// MediaRecorder对象 private String strTempFile = "recaudio_";// 零时文件的前缀 private String voicePath; private Button mBtnReset; private Button mBtnDelete; private int flag = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); /* 检测是否存在SD卡 */ if (Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) { mRecAudioPath = Environment.getExternalStorageDirectory();// 得到SD卡得路径 } else { Toast.makeText(MainActivity.this, "没有SD卡", Toast.LENGTH_LONG).show(); } } private void initView() { mRecord = (LinearLayout)findViewById(R.id.ll_recording); mVoice = (ImageView)findViewById(R.id.iv_voice); mStatus = (TextView)findViewById(R.id.tv_click_status); mTimer = (Chronometer)findViewById(R.id.chr_timer); mBtnReset = (Button)findViewById(R.id.btn_voice_reset); mBtnDelete = (Button)findViewById(R.id.btn_voice_delete); mBtnReset.setVisibility(View.GONE); mBtnDelete.setVisibility(View.GONE); mRecord.setOnClickListener(this); mBtnDelete.setOnClickListener(this); mBtnReset.setOnClickListener(this); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.ll_recording : if (flag == 0) { mVoice.setImageResource(R.drawable.icon_record_moving); mStatus.setText("点击停止录音"); mTimer.setVisibility(View.VISIBLE); mTimer.setBase(SystemClock.elapsedRealtime()); mTimer.start(); try { /* ①Initial:实例化MediaRecorder对象 */ mMediaRecorder = new MediaRecorder(); /* ②setAudioSource/setVedioSource*/ mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置麦克风 /* ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default * THREE_GPP(3gp格式,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB) * */ mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default */ mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); /* ②设置输出文件的路径 */ try { mRecAudioFile = File.createTempFile(strTempFile, ".mp4", mRecAudioPath); voicePath = mRecAudioPath + "/" + strTempFile + System.currentTimeMillis() + ".mp4"; } catch (Exception e) { e.printStackTrace(); } mMediaRecorder.setOutputFile(mRecAudioFile.getAbsolutePath()); /* ③准备 */ mMediaRecorder.prepare(); /* ④开始 */ mMediaRecorder.start(); /*按钮状态*/ } catch (IOException e) { e.printStackTrace(); } }else if (flag == 1){ mVoice.setImageResource(R.drawable.icon_record_on); mStatus.setText("点击试听"); mTimer.stop(); // TODO Auto-generated method stub if (mRecAudioFile != null) { /* ⑤停止录音 */ mMediaRecorder.stop(); /* ⑥释放MediaRecorder */ mMediaRecorder.release(); mMediaRecorder = null; } }else if (flag == 2) { //mVoice.setImageResource(R.drawable.icon_record_nor); //mStatus.setText("点击开始录音"); mBtnReset.setVisibility(View.VISIBLE); mBtnDelete.setVisibility(View.VISIBLE); mTimer.stop(); mTimer.setVisibility(View.GONE); mRecord.setEnabled(false); /* 得到被点击的文件 */ Log.d("haha", "onClick: " +voicePath); playMusic(mRecAudioFile); } flag = (flag + 1) % 3; break; case R.id.btn_voice_reset : flag = 0; mVoice.setImageResource(R.drawable.icon_record_nor); mStatus.setText("点击开始录音"); mRecord.setEnabled(true); mBtnReset.setVisibility(View.GONE); mBtnDelete.setVisibility(View.GONE); break; case R.id.btn_voice_delete : if (mRecAudioFile == null) { return; } mRecAudioFile.delete(); Toast.makeText(MainActivity.this,"录音已删除",Toast.LENGTH_SHORT).show(); break; default: break; } } /* 播放录音文件 */ private void playMusic(File file) { MediaPlayer player = new MediaPlayer(); try { player.setDataSource(file.getPath()); player.prepare(); player.start(); } catch (IOException e) { e.printStackTrace(); } } }
项目地址:RecordDemo
相关文章推荐
- JNI在Android开发中的应用之--用AudioRecord录音,用AudioTrack播放声音.
- android开发(18) 调用手机的麦克风录音,并播放。
- Android开发笔记(五十七)录像录音与播放
- Android编程开发录音和播放录音简单示例
- android开发录音和播放录音
- android开发(18) 调用手机的麦克风录音,并播放。
- 使用Android开发录音和播放功能小程序示例
- JNI在Android开发中的应用之--用AudioRecord录音,用AudioTrack播放声音.
- Android开发之录音MediaRecorder、播放音频(MediaPlayer、SoundPool)
- android开发录音和播放录音的例子
- Android开发学习之录音同步播放的实现
- android开发录音和播放录音的例子
- Android开发录音和播放音频的步骤(动态获取权限)
- iphone开发 服务器、android、iphone音频文件播放和传输 amr和wav的转换
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- android录音开发
- Android自动电话录音开发过程及问题
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- android录音和播放录音