android 简单实现录音功能

  1. 一.xml页面布局
复制代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <!-- 显示数字 "1" 的 TextView -->
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="1"
        android:textSize="24sp"
        android:gravity="center"
        android:paddingBottom="16dp"/>

    <!-- 开始录音按钮 -->
    <Button
        android:id="@+id/startRecord"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="开始录音"
        android:textSize="18sp"
        android:padding="12dp"
        android:layout_marginBottom="8dp"/>

    <!-- 停止录音按钮 -->
    <Button
        android:id="@+id/stopRecord"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="停止录音"
        android:textSize="18sp"
        android:padding="12dp"
        android:layout_marginBottom="8dp"/>

    <!-- 开始播放按钮 -->
    <Button
        android:id="@+id/startPlay"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="开始播放"
        android:textSize="18sp"
        android:padding="12dp"
        android:layout_marginBottom="8dp"/>

    <!-- 停止播放按钮 -->
    <Button
        android:id="@+id/stopPlay"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="停止播放"
        android:textSize="18sp"
        android:padding="12dp"
        android:layout_marginBottom="8dp"/>

</LinearLayout>
  1. 2.对应的java页面
复制代码
public class MainActivity extends AppCompatActivity {

    private static final String LOG_TAG = "MainActivity";
    // 语音文件保存路径
    private String FileName = null;

    // 界面控件
    private Button startRecord;
    private Button startPlay;
    private Button stopRecord;
    private Button stopPlay;

    // 语音操作对象
    private MediaPlayer mPlayer = null;
    private MediaRecorder mRecorder = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化控件
        startRecord = findViewById(R.id.startRecord);
        startPlay = findViewById(R.id.startPlay);
        stopRecord = findViewById(R.id.stopRecord);
        stopPlay = findViewById(R.id.stopPlay);

        // 设置按钮监听器
        startRecord.setOnClickListener(new startRecordListener());
        stopRecord.setOnClickListener(new stopRecordListener());
        startPlay.setOnClickListener(new startPlayListener());
        stopPlay.setOnClickListener(new stopPlayListener());

        // 设置语音文件保存路径
        FileName = getExternalFilesDir(Environment.DIRECTORY_MUSIC).getAbsolutePath() + "/audiorecordtest.3gp";

        // 请求权限
        requestPermissions();
    }

    // 请求录音和存储权限
    private void requestPermissions() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.RECORD_AUDIO, Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    1);
        }
    }

    // 开始录音
    class startRecordListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            // 检查权限
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
                Log.e(LOG_TAG, "没有录音权限!");
                return;
            }

            mRecorder = new MediaRecorder();
            try {
                mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                mRecorder.setOutputFile(FileName);
                mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                mRecorder.prepare();
                mRecorder.start();
            } catch (IOException e) {
                Log.e(LOG_TAG, "录音准备或启动失败:" + e.getMessage());
            }
        }
    }

    // 停止录音
    class stopRecordListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            if (mRecorder != null) {
                try {
                    mRecorder.stop();
                } catch (RuntimeException e) {
                    Log.e(LOG_TAG, "停止录音失败:" + e.getMessage());
                } finally {
                    mRecorder.release();
                    mRecorder = null;
                }
            }
        }
    }

    // 开始播放
    class startPlayListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            mPlayer = new MediaPlayer();
            try {
                mPlayer.setDataSource(FileName);
                mPlayer.prepare();
                mPlayer.start();
            } catch (IOException e) {
                Log.e(LOG_TAG, "播放失败:" + e.getMessage());
            }
        }
    }

    // 停止播放
    class stopPlayListener implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            if (mPlayer != null) {
                mPlayer.release();
                mPlayer = null;
            }
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        if (requestCode == 1) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d(LOG_TAG, "权限已授予");
            } else {
                Log.e(LOG_TAG, "权限被拒绝");
            }
        }
    }
}最后不要忘记加对应的请求权限
相关推荐
selt7913 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript
Yao_YongChao3 小时前
Android MVI处理副作用(Side Effect)
android·mvi·mvi副作用
非凡ghost4 小时前
JRiver Media Center(媒体管理软件)
android·学习·智能手机·媒体·软件需求
席卷全城4 小时前
Android 推箱子实现(引流文章)
android
齊家治國平天下5 小时前
Android 14 系统中 Tombstone 深度分析与解决指南
android·crash·系统服务·tombstone·android 14
maycho1237 小时前
MATLAB环境下基于双向长短时记忆网络的时间序列预测探索
android
思成不止于此7 小时前
【MySQL 零基础入门】MySQL 函数精讲(二):日期函数与流程控制函数篇
android·数据库·笔记·sql·学习·mysql
brave_zhao7 小时前
达梦数据库(DM8)支持全文索引功能,但并不直接兼容 MySQL 的 FULLTEXT 索引语法
android·adb
sheji34167 小时前
【开题答辩全过程】以 基于Android的网上订餐系统为例,包含答辩的问题和答案
android
easyboot8 小时前
C#使用SqlSugar操作mysql数据库
android·sqlsugar