博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 录音实现不再担心 - 个案例帮你解决你的问题
阅读量:7224 次
发布时间:2019-06-29

本文共 6242 字,大约阅读时间需要 20 分钟。

最近有小伙伴经常android的录音怎么实现,有没有相关的案例。今天给大家推荐一个android中实现录音和播放的小案例。

效果图:

image

一、实现录音的 Service

关键代码:

// 开始录音    public void startRecording() {        setFileNameAndPath();        mRecorder = new MediaRecorder();        mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);        mRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); //录音文件保存的格式,这里保存为 mp4        mRecorder.setOutputFile(mFilePath); // 设置录音文件的保存路径        mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);        mRecorder.setAudioChannels(1);        // 设置录音文件的清晰度        mRecorder.setAudioSamplingRate(44100);        mRecorder.setAudioEncodingBitRate(192000);        try {            mRecorder.prepare();            mRecorder.start();            mStartingTimeMillis = System.currentTimeMillis();        } catch (IOException e) {            Log.e(LOG_TAG, "prepare() failed");        }    }    // 设置录音文件的名字和保存路径    public void setFileNameAndPath() {        File f;        do {            count++;            mFileName = getString(R.string.default_file_name)                    + "_" + (System.currentTimeMillis()) + ".mp4";            mFilePath = Environment.getExternalStorageDirectory().getAbsolutePath();            mFilePath += "/SoundRecorder/" + mFileName;            f = new File(mFilePath);        } while (f.exists() && !f.isDirectory());    }    // 停止录音    public void stopRecording() {        mRecorder.stop();        mElapsedMillis = (System.currentTimeMillis() - mStartingTimeMillis);        mRecorder.release();        getSharedPreferences("sp_name_audio", MODE_PRIVATE)                .edit()                .putString("audio_path", mFilePath)                .putLong("elpased", mElapsedMillis)                .apply();        if (mIncrementTimerTask != null) {            mIncrementTimerTask.cancel();            mIncrementTimerTask = null;        }        mRecorder = null;    }复制代码

二、显示录音界面的 RecordAudioDialogFragment

用户进行的时候,总不能让 App 跳转到另外一个界面吧,这样用户体验并不是很好,比较好的方法是显示一个对话框,让用户进行操作,既然要用对话框,必然离不开 DialogFragment

在 RecordAudioDialogFragment 有一个 newInstance(int maxTime) 的静态方法供外部调用,如果想设置录音的最大时长,直接传参数进去就行了。

好的,敲黑板,重点来了,其实这个对话框的重点部分就是在 onCreateDialog()中,我们先加载了我们自定义的对话框的布局,当点击录音的按钮的时候,先进行相关权限的申请,这里有个巨坑,录音权限 android.permission.RECORD_AUDIO 在不久前还是普通权限的,不知道什么时候突然变成了危险权限,需要我们进行申请,Google 真是会玩。

public Dialog onCreateDialog(Bundle savedInstanceState) {        Dialog dialog = super.onCreateDialog(savedInstanceState);        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());        View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_record_audio, null);        mFabRecord.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE)                        != PackageManager.PERMISSION_GRANTED) {                    ActivityCompat.requestPermissions(getActivity()                            , new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.RECORD_AUDIO}, 1);                }else {                    onRecord(mStartRecording);                    mStartRecording = !mStartRecording;                }            }        });        builder.setView(view);        return builder.create();    }复制代码

三、播放录音的 PlaybackDialogFragment

其实,如果只是录音这一块的话,写个 MediaPlayer 就可以了,然而还要写播放的时间进度,以及显示一个稍微好看点的进度条,我能怎样,我也很烦啊。

外部调用这个对话框的时候,只需要传入一个包含录音文件信息的 RecordingItem,因为包含的信息比较多,所以最好将 RecordingItem 进行序列化。

public static PlaybackDialogFragment newInstance(RecordingItem item) {        PlaybackDialogFragment fragment = new PlaybackDialogFragment();        Bundle bundle = new Bundle();        bundle.putParcelable(ARG_ITEM, item);        fragment.setArguments(b);        return fragment;    }复制代码

好,重点又来了,来看看 onCreateDialog() 方法,在加载了布局之后,给 mSeekBar 设置监听,mSeekBar 是一个显示进度条的控件,当开始播放录音时候,将录音文件的时长,设置进 mSeekBar 里面,播放录音的同时,运行 mSeekBar,通过监听 mSeekBar 的进度,刷新显示的播放进度。

public Dialog onCreateDialog(Bundle savedInstanceState) {        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());        View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_media_playback, null);        mFileLengthTextView.setText(String.valueOf(mFileLength));        mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {            @Override            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {                if(mMediaPlayer != null && fromUser) {                    mMediaPlayer.seekTo(progress);                    mHandler.removeCallbacks(mRunnable);                    long minutes = TimeUnit.MILLISECONDS.toMinutes(mMediaPlayer.getCurrentPosition());                    long seconds = TimeUnit.MILLISECONDS.toSeconds(mMediaPlayer.getCurrentPosition())                            - TimeUnit.MINUTES.toSeconds(minutes);                    mCurrentProgressTextView.setText(String.format("%02d:%02d", minutes,seconds));                    updateSeekBar();                } else if (mMediaPlayer == null && fromUser) {                    prepareMediaPlayerFromPoint(progress);                    updateSeekBar();                }            }        });        mPlayButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                onPlay(isPlaying);                isPlaying = !isPlaying;            }        });        mFileLengthTextView.setText(String.format("%02d:%02d", minutes,seconds));        builder.setView(view);        return builder.create();    }复制代码

当点击播放录音的按钮之后,会调用 onPlay() 方法,然后根据 isPlaying(标识当前是否播放录音)的值,来调用不同的方法

private void onPlay(boolean isPlaying){        if (!isPlaying) {            //currently MediaPlayer is not playing audio            if(mMediaPlayer == null) {                startPlaying(); //start from beginning            }         } else {            pausePlaying();        }    }复制代码

我们最关心的,莫过于 startPlaying() 这个方法,这个方法便是来开启播放录音的,我们首先将外部传入的有关的录音信息,设置给 MediaPlayer,然后开始调用 mMediaPlayer.start() 进行录音的播放,然后调用 updateSeekbar() 实时更新进度条的内容。当 MediaPlayer 的内容播放完成后,调用 stopPlaying() 方法,关闭 mMediaPlayer

项目地址:

更多文章

相信自己,没有做不到的,只有想不到的

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :644196190

微信公众号:终端研发部

技术+职场

转载地址:http://obkfm.baihongyu.com/

你可能感兴趣的文章
Cordova + Vue 实现点击两次退出应用
查看>>
JAVA 多用户商城系统b2b2c-Spring Cloud Stream 介绍
查看>>
spring cloud构建互联网分布式微服务云平台-SpringCloud集成项目简介
查看>>
基于房源的画像分析
查看>>
80% UI 初学者走过的弯路,你走了几条?
查看>>
文档和元素的几何滚动
查看>>
php 设计模式
查看>>
Java springcloud B2B2C o2o多用户商城 springcloud架构(八)springboot整合mongodb
查看>>
3年工作经验的Java程序员面试经过
查看>>
Mysql 批量写入数据,对于这类性能问题,你是如何优化的
查看>>
MySQL无法启动几种常见问题小结
查看>>
阿里CTO:阿里所有技术和产品输出都将必须通过阿里云进行
查看>>
更好用的集群限流功能,Sentinel 发布 v1.4.2
查看>>
Python(生成执行文件)
查看>>
redis安装配置 - ttlsa教程系列之redis
查看>>
Linux --DHCP服务器配置;DHCP服务器中继
查看>>
IE版本多的可爱_已迁移
查看>>
eclipse查看jar包中class的中文注释乱码问题的解决
查看>>
我的友情链接
查看>>
我的友情链接
查看>>