效果图:

android录音实现_第1张图片

一、实现录音的 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。。。。

更多相关文章

  1. Android文件夹大小
  2. 阻止dialog消失的方法 (Android Platform)
  3. Android中的多种文件读写操作方法
  4. android 监听其它app的错误或者崩溃的方法 (ProcessErrorStateInf
  5. Android中获取屏幕长宽的方法
  6. android 文件搜索

随机推荐

  1. Android使用Bmob后台服务器的基础配置与
  2. 八款 Galaxy Tab 平板將於下月開始更新至
  3. android 信息(mms)的故事 (一)
  4. Android(安卓)取得应用程序的启动次数和
  5. Android-电量优化
  6. android展讯平台重要的打包命令及生成镜
  7. 观察者模式在android 上的最佳实践
  8. 支付宝客户端架构解析:Android 容器化框架
  9. 经验总结-Android手机屏幕适配问题
  10. Android 使用Vitamio打造自己的万能播放