Android AMR格式录音和播放,仿微信
16lz
2021-01-23
首先申请应用权限
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
录音播放实现代码
public class AudioRecordTest extends Activity {private static final String LOG_TAG = "AudioRecordTest";private static String mFileName = null;private RecordButton mRecordButton = null;private MediaRecorder mRecorder = null;private PlayButton mPlayButton = null;private MediaPlayer mPlayer = null;/** * 开始或停止保存录音 */private void onRecord(boolean start) {if (start) {startRecording();} else {stopRecording();}}/** * 播放或停止播放录音 */private void onPlay(boolean start) {if (start) {startPlaying();} else {stopPlaying();}}private void startPlaying() {mPlayer = new MediaPlayer();try {mPlayer.setDataSource(mFileName);mPlayer.prepare();mPlayer.start();} catch (IOException e) {Log.e(LOG_TAG, "prepare() failed");}}private void stopPlaying() {mPlayer.release();mPlayer = null;}/** * 开始录音 */private void startRecording() {mRecorder = new MediaRecorder();mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//RAW_AMR虽然被高版本废弃,但它兼容低版本还是可以用的mRecorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR);mRecorder.setOutputFile(mFileName);mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);try {mRecorder.prepare();} catch (IOException e) {Log.e(LOG_TAG, "prepare() failed");}mRecorder.start();}private void stopRecording() {mRecorder.stop();mRecorder.release();mRecorder = null;}class RecordButton extends Button {boolean mStartRecording = true;OnClickListener clicker = new OnClickListener() {public void onClick(View v) {onRecord(mStartRecording);if (mStartRecording) {setText("Stop recording");} else {setText("Start recording");}mStartRecording = !mStartRecording;}};public RecordButton(Context ctx) {super(ctx);setText("Start recording");setOnClickListener(clicker);}}class PlayButton extends Button {boolean mStartPlaying = true;OnClickListener clicker = new OnClickListener() {public void onClick(View v) {onPlay(mStartPlaying);if (mStartPlaying) {setText("Stop playing");} else {setText("Start playing");}mStartPlaying = !mStartPlaying;}};public PlayButton(Context ctx) {super(ctx);setText("Start playing");setOnClickListener(clicker);}}public AudioRecordTest() {mFileName = Environment.getExternalStorageDirectory().getAbsolutePath();//在你本地SD卡根目录输出录音文件mFileName += "/audioRecordtestMusic.amr";}@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);//保持屏幕唤醒,否则在录音过程当中锁屏容易被回收getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);LinearLayout ll = new LinearLayout(this);//录音按钮mRecordButton = new RecordButton(this);ll.addView(mRecordButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));//播放按钮mPlayButton = new PlayButton(this);ll.addView(mPlayButton, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 0));setContentView(ll);}@Overridepublic void onPause() {super.onPause();if (mRecorder != null) {mRecorder.release();mRecorder = null;}if (mPlayer != null) {mPlayer.release();mPlayer = null;}}}
使用结果
1.作者亲自测试,AMR格式的录音正常人说一句话一般在5KB~10KB之前,也就是说1MB你可以说200多句话相当不错更多相关文章
- android获取版本信息、屏幕信息和设备编号
- android高版本Toast问题
- Android统一依赖多个不同版本的Support v7包
- android 读取根目录下的文件或文件夹
- Flutter——flutter版本升级到1.2.1后遇到的问题:...AndroidX inc
- Android系统版本号对应的代号以及API等级一览表
- android 版本更新6.0、7.0和8.0权限适配