Android--录音

简介: 版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/81327067 录音分为环境录音和通话录音。
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/81327067

录音分为环境录音和通话录音。

环境录音:

public class audio {
    private static MediaRecorder mMediaRecorder;
    private static String fileName= "";

    @SuppressLint("LongLogTag")
    public static void startRecord() {
        // 开始录音
    /* ①Initial:实例化MediaRecorder对象 */
        if (mMediaRecorder == null)
            mMediaRecorder = new MediaRecorder();
        try {
        /* ②setAudioSource/setVedioSource */
            mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// 设置麦克风
        /*
         * ②设置输出文件的格式:THREE_GPP/MPEG-4/RAW_AMR/Default THREE_GPP(3gp格式
         * ,H263视频/ARM音频编码)、MPEG-4、RAW_AMR(只支持音频且音频编码要求为AMR_NB)
         */
            mMediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        /* ②设置音频文件的编码:AAC/AMR_NB/AMR_MB/Default 声音的(波形)的采样 */
            mMediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
            fileName = DateFormat.format("yyyyMMdd_HHmmss", Calendar.getInstance(Locale.CHINA)) + ".m4a";
            MakeFile.makeRootDirectory(Environment.getExternalStorageDirectory().getPath()+"/Android/audio/");
            String filePath = Environment.getExternalStorageDirectory().getPath()+"/Android/audio/" + fileName;
        /* ③准备 */
            mMediaRecorder.setOutputFile(filePath);
            mMediaRecorder.prepare();
        /* ④开始 */
            mMediaRecorder.start();
        } catch (IllegalStateException e) {
            Log.i("call startAmr(File mRecAudioFile) failed!" ,e.getMessage());
        } catch (IOException e) {
            Log.i("call startAmr(File mRecAudioFile) failed!", e.getMessage());
        }
    }

    public static void stopRecord() {
        try {
            mMediaRecorder.stop();
            mMediaRecorder.release();
            mMediaRecorder = null;

        } catch (RuntimeException e) {
            Log.e("errp",e.toString());
            mMediaRecorder.reset();
            mMediaRecorder.release();
            mMediaRecorder = null;

        }
    }

}

通话录音,在service里面,可以写守护进程:

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;

import java.io.File;

public class SystemService extends Service {
	// 电话管理器
	private TelephonyManager tm;
	// 监听器对象
	private MyListener listener;
	//声明录音机
	private MediaRecorder mediaRecorder;

	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	/**
	 * 服务创建的时候调用的方法
	 */
	@Override
	public void onCreate() {
		// 后台监听电话的呼叫状态。
		// 得到电话管理器
		tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
		listener = new MyListener();
		tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
		super.onCreate();
	}

	private class MyListener extends PhoneStateListener {
		// 当电话的呼叫状态发生变化的时候调用的方法
		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			super.onCallStateChanged(state, incomingNumber);
			try {
				switch (state) {
					case TelephonyManager.CALL_STATE_IDLE://空闲状态。
						if(mediaRecorder!=null){
							//8.停止捕获
							mediaRecorder.stop();
							//9.释放资源
							mediaRecorder.release();
							mediaRecorder = null;
							//TODO 这个地方你可以将录制完毕的音频文件上传到服务器,这样就可以监听了
							Log.i("SystemService", "音频文件录制完毕,可以在后台上传到服务器");
						}

						break;
					case TelephonyManager.CALL_STATE_RINGING://零响状态。

						break;
					case TelephonyManager.CALL_STATE_OFFHOOK://通话状态
						//开始录音
						//1.实例化一个录音机
						mediaRecorder = new MediaRecorder();
						//2.指定录音机的声音源
						mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
						//3.设置录制的文件输出的格式
						mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);
						//4.指定录音文件的名称
						File file = new File(Environment.getExternalStorageDirectory().getPath()+"/Android/audio/",System.currentTimeMillis()+".m4a");
						mediaRecorder.setOutputFile(file.getAbsolutePath());
						//5.设置音频的编码
						mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
						//6.准备开始录音
						mediaRecorder.prepare();
						//7.开始录音
						mediaRecorder.start();
						break;
					default:
						break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 服务销毁的时候调用的方法
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		// 取消电话的监听,采取线程守护的方法,当一个服务关闭后,开启另外一个服务,除非你很快把两个服务同时关闭才能完成
		Intent i = new Intent(this,SystemService2.class);
		startService(i);
		tm.listen(listener, PhoneStateListener.LISTEN_NONE);
		listener = null;
	}

}

权限:

<!--额外的权限-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

 

目录
相关文章
|
存储 XML API
Android调用相机拍照录视频录音以及存储,7.0以上及以下都可使用。
Android调用相机拍照录视频录音以及存储,7.0以上及以下都可使用。
296 0
|
Android开发
Android实现调用系统相机录像及实现录音
Android实现调用系统相机录像及实现录音
578 0
|
XML Android开发 数据格式
【安卓开发】Android实现录音并播放功能
【安卓开发】Android实现录音并播放功能
161 0
|
存储 Android开发 图形学
Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)
Unity通过Android Studio 获取手机权限(存储、录音、相机等) 文章目录 Unity通过Android Studio 获取手机权限(存储、录音、相机等) 常用权限 一、动态获取权限流程 二、使用步骤 1.检测当前是否已获取权限 2.检测当前安卓版本 3.申请动态获取权限 总结
Unity与Android Studio交互之 ✨ 获取手机权限(存储、录音、相机等)
|
Android开发 内存技术
Android音视频之AudioRecord录音(一)
Android音视频之AudioRecord录音(一)在音视频开发中,录音当然是必不可少的。首先我们要学会单独的录音功能,当然这里说的录音是指用AudioRecord来录音,读取录音原始数据,读到的就是所谓的PCM数据。
1442 0
|
Web App开发 API Android开发
|
XML Java Android开发
手把手教你Android来去电通话自动录音的方法
原文:手把手教你Android来去电通话自动录音的方法 http://www.jizhuomi.com/android/example/354.html 我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能。
3296 0
|
测试技术 Linux API
Android下音频的测试程序tinyalsa(录音,放音,查看声卡信息)
audio代码比较复杂,除了音频参数,我们平时客制化的地方不多。所以没有太深入了解。建议先抽空看看如下代码:kernel, linux alsa 架构:kernel-3.10/sound/soc/mediatek/kernel-3.
6149 0