扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
1 Android录音需要声明录音权限
抚顺ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!
uses-permission android:name="android.permission.RECORD_AUDIO" /
uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /
uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /
2.录音文件要写到文件夹中,创建文件夹,在Application的onCreate方法中创建文件夹
@Override
public void onCreate() {
super.onCreate();
CrashHandler mCrashHandler = CrashHandler.getInstance();
mCrashHandler.init(getApplicationContext(), getClass());
initFile();
}
private void initFile() {
//录音文件
File audioFile = new File(Constant.UrlAudio);
if (!audioFile.exists()) {
audioFile.mkdirs();
} else if (!audioFile.isDirectory()) {
audioFile.delete();
audioFile.mkdirs();
}
//拍摄图片文件
File imageFile = new File(Constant.UrlImage);
if (!imageFile.exists()) {
imageFile.mkdirs();
} else if (!imageFile.isDirectory()) {
imageFile.delete();
imageFile.mkdirs();
}
}
Constant.UrlImage是个静态的文件路径
//录音文件
public static String UrlAudio = FileUtil.getSdcardPathOnSys()+"/EhmFile/media/audio/";
3.在activity中开始录音
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.media.MediaRecorder;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.io.File;
import java.io.IOException;
import java.util.Calendar;
import java.util.Locale;
public class Record2Activity extends AppCompatActivity {
// 录音界面相关
Button btnStart;
Button btnStop;
TextView textTime;
// 录音功能相关
MediaRecorder mMediaRecorder; // MediaRecorder 实例
boolean isRecording; // 录音状态
String fileName; // 录音文件的名称
String filePath; // 录音文件存储路径
Thread timeThread; // 记录录音时长的线程
int timeCount; // 录音时长 计数
final int TIME_COUNT = 0x101;
// 录音文件存放目录
final String audioSaveDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/audiodemo/";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record2);
btnStart = (Button) findViewById(R.id.btn_start);
btnStop = (Button) findViewById(R.id.btn_stop);
textTime = (TextView) findViewById(R.id.text_time);
btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 开始录音
btnStart.setEnabled(false);
btnStop.setEnabled(true);
startRecord();
isRecording = true;
// 初始化录音时长记录
timeThread = new Thread(new Runnable() {
@Override
public void run() {
countTime();
}
});
timeThread.start();
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 停止录音
btnStart.setEnabled(true);
btnStop.setEnabled(false);
stopRecord();
isRecording = false;
}
});
}
// 记录录音时长
private void countTime() {
while (isRecording) {
Log.d("mediaRe","正在录音");
timeCount++;
Message msg = Message.obtain();
msg.what = TIME_COUNT;
msg.obj = timeCount;
myHandler.sendMessage(msg);
try {
timeThread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d("mediaRec", "结束录音");
timeCount = 0;
Message msg = Message.obtain();
msg.what = TIME_COUNT;
msg.obj = timeCount;
myHandler.sendMessage(msg);
}
/**
* 开始录音 使用amr格式
* 录音文件
*
* @return
*/
public 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";
//注意文件夹要创建之后才能使用
filePath = Constant.UrlAudio + fileName;
/* ③准备 */
mMediaRecorder.setOutputFile(filePath);
mMediaRecorder.prepare();
/* ④开始 */
mMediaRecorder.start();
} catch (IllegalStateException e) {
Log.i("mediaEr", "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
} catch (IOException e) {
e.printStackTrace();
Log.i("mediaEr", "call startAmr(File mRecAudioFile) failed!" + e.getMessage());
}
}
/**
* 停止录音
*/
public void stopRecord() {
//有一些网友反应在5.0以上在调用stop的时候会报错,翻阅了一下谷歌文档发现上面确实写的有可能会报错的情况,捕获异常清理一下就行了,感谢大家反馈!
try {
mMediaRecorder.stop();
mMediaRecorder.release();
mMediaRecorder = null;
filePath = "";
} catch (RuntimeException e) {
Log.e("mediaR", e.toString());
mMediaRecorder.reset();
mMediaRecorder.release();
mMediaRecorder = null;
File file = new File(filePath);
if (file.exists())
file.delete();
filePath = "";
}
}
// 格式化 录音时长为 秒
public static String FormatMiss(int miss) {
return "" + miss;
}
Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case TIME_COUNT:
int count = (int) msg.obj;
Log.d("meidaRe","count == " + count);
textTime.setText(FormatMiss(count));
break;
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
myHandler.removeCallbacksAndMessages(null);
}
}
布局文件很简单
?xml version="1.0" encoding="utf-8"?
androidx.constraintlayout.widget.ConstraintLayout xmlns:android=""
xmlns:app=""
xmlns:tools=""
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Record2Activity"
Button
android:id="@+id/btn_stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="结束"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toEndOf="@+id/btn_start"
app:layout_constraintTop_toTopOf="parent" /
Button
android:id="@+id/btn_start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开始"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/btn_stop"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /
TextView
android:id="@+id/text_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="11dp"
android:layout_marginTop="47dp"
android:text="时间"
app:layout_constraintStart_toStartOf="@+id/btn_start"
app:layout_constraintTop_toBottomOf="@+id/btn_start" /
/androidx.constraintlayout.widget.ConstraintLayout
这样就可以使用录音功能了
如果您使用的是华为手机,可以通过以下方法操作:
一、通话期间录音
通话过程中,在通话界面,点击录音,可录取当前通话内容。
二、开启自动录音功能
开启自动录音,帮您记录每一个重要通话内容。
1.进入电话 四个点 设置 通话自动录音,开启通话自动录音开关,会自动对所有通话进行录音。
2.如需对特定号码的通话录音,点击自动录音对象,设置指定号码。
三、查看通话录音结果
打开文件管理,搜索 Sounds 并进入此文件夹,然后点击 CallRecord 查看通话录音文件。
若使用vivo手机,通话录音可参考以下设置方法:
1、可以进入手机设置--(应用与权限)--(系统应用设置)--电话--通话录音中,选择“所有通话自动录音”或“指定号码自动录音”,设置后,当您开始通话时,手机会自动进行录音。
从Funtouch OS 2.0开始的机器都支持通话自动录音(不包括Funtouch OS 3.0)
2、拨打电话时,您点击通话界面的“录音”即可录通话内容,通话结束后,文件可进入文件管理--本地文件/所有文件/手机存储--Record/录音文件夹中找到。
1.安卓手机录音寻找方法如下:第一打开手机的录音机,点击手机按键菜单键。
2.进入录音机设定模式,看看录音文件是存在存储卡还是手机内存文件夹。
3.如果看到手机是把录音文件放在了存储卡上,手机连接上电脑进入我的存储卡。
4.打开SOUND文件夹,录音文件都在这里了,录音文件为3ga后缀的文件这些就是安卓类手机的录音文件了。
若使用的是vivo手机,在通话的时候点击键盘上的录音按钮即可录音,录音文件保存在文件管理--本地文件/所有文件/手机存储--Record/录音文件夹中(通话录音的保存路径无法修改)。
若是指vivo手机查看通话录音保存位置:
OriginOS Ocean系统:进入文件管理--手机存储--(Recordings)--Record--Call文件夹--即可查看通话录音;
其他系统:进入文件管理--手机存储/本地文件/所有文件--Record/录音文件夹--即可查看通话录音。
注:通话录音的保存路径不支持修改。
更多疑问可以点击此链接询问在线客服。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流