AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" /> <!-- 用于写入缓存数据到扩展存储卡 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="开始录音" />
<Button
android:id="@+id/btn_end"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="结束录音" />
<Button
android:id="@+id/btn_play"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="播放录音" />
<Button
android:id="@+id/btn_go_pause"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="暂停/继续" />
<Chronometer
android:id="@+id/chronometer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" />
</LinearLayout>
功能代码
package com.demo.cn;
import android.Manifest;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.media.MediaRecorder;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class MainActivity extends AppCompatActivity implements Chronometer.OnChronometerTickListener {
public static final String TAG = "MainActivity";
@BindView(R.id.btn_start)
Button btnStart;
@BindView(R.id.btn_end)
Button btnEnd;
@BindView(R.id.btn_play)
Button btnPlay;
@BindView(R.id.btn_go_pause)
Button btnGoPause;
@BindView(R.id.chronometer)
Chronometer chronometer;
private String path;
private String name;
private MediaRecorder mMediaRecorder;
private MediaPlayer mMediaPlayer;
private int pause;
private File mFile;
int current = 0;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
initData();
checkPermission();
}
/**
* 权限申请及通知权限申请跳转
*/
private void checkPermission() {
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissions.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(this, android.Manifest.permission.RECORD_AUDIO)) {
permissions.add(Manifest.permission.RECORD_AUDIO);
}
if (permissions.size() != 0) {
ActivityCompat.requestPermissions(this, permissions.toArray(new String[0]), 100);
}
}
}
private void initData() {
//正数计时设置初始值(重置)
chronometer.setBase(0);
//正数计时事件监听器,时间发生变化时可进行操作
chronometer.setOnChronometerTickListener(this);
//设置格式(默认"MM:SS"格式)
chronometer.setFormat("%s");
chronometer.setText(FormatMiss(current));
chronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener() {
@Override
public void onChronometerTick(Chronometer chronometer) {
current++;
chronometer.setText(FormatMiss(current));
}
});
}
@OnClick({R.id.btn_start, R.id.btn_end, R.id.btn_play, R.id.btn_go_pause})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btn_start:
startSound();//开始录制
chronometer.start();//计时开始
break;
case R.id.btn_end:
stopSound();//结束录制
chronometer.stop();//计时结束
break;
case R.id.btn_play:
//播放音频
playSound();
break;
case R.id.btn_go_pause:
if (pause == 0) {//暂停状态
btnGoPause.setText("继续播放");
mMediaPlayer.pause();
pause = 1;
} else {//播放状态
btnGoPause.setText("暂停播放");
mMediaPlayer.start();
pause = 0;
}
break;
}
}
//开始录制
public void startSound() {
path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/1video";
name = "video";//文件保存于手机的名称
mMediaRecorder = new MediaRecorder();
//设置音频格式
mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//设置音频输出后的保存格式
mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
//设置音频编码格式
mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
//设置音频通道号
mMediaRecorder.setAudioChannels(1);
//设置录音文件的清晰度
mMediaRecorder.setAudioSamplingRate(44100);
mMediaRecorder.setAudioEncodingBitRate(192000);
File file = new File(path);
if (!file.exists()) {
file.delete();
}
//指定一个输出文件,获取当前时间用户存储名称
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
String time = dateFormat.format(date);
String filename = time + name;//文件名称以录制时间加自定义名称命名
mMediaRecorder.setOutputFile(path + File.separator + filename + ".mp3");
mFile = new File(path + File.separator + filename + ".mp3");
System.out.println(mFile);//输出保存路径,一般是存储与手机文件管理音频文件夹中
if (mFile.exists()) {
mFile.delete();
}
try {
mMediaRecorder.prepare();
mMediaRecorder.start();
} catch (IOException e) {
Log.e(TAG, "prepare()failed");
}
}
/**
* 结束录制
*/
public void stopSound() {
if (mMediaRecorder != null) {
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
}
}
//播放
private void playSound() {
mMediaPlayer = new MediaPlayer();
try {
mMediaPlayer.setDataSource(mFile.getPath());
mMediaPlayer.prepare();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mMediaPlayer.start();
}
});
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
if (mMediaPlayer.isPlaying()) {
Log.i(TAG, "onCompletion:正在播放");
} else {
mMediaPlayer.release();
}
}
});
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onChronometerTick(Chronometer chronometer) {
}
//正数计时显示格式
public static String FormatMiss(int time) {
String hh = time / 3600 > 9 ? time / 3600 + "" : "0" + time / 3600;
String mm = (time % 3600) / 60 > 9 ? (time % 3600) / 60 + "" : "0" + (time % 3600) / 60;
String ss = (time % 3600) % 60 > 9 ? (time % 3600) % 60 + "" : "0" + (time % 3600) % 60;
return hh + ":" + mm + ":" + ss;
}
}