Android实现调用录音功能实现录制播放暂停功能

在这里插入图片描述
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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值