uni-app Android原生录音插件支持暂停继续且不限制录音时长 生成文件小 进入后台后无法启动录音
uni-app Android原生录音插件支持暂停继续且不限制录音时长 生成文件小 进入后台后无法启动录音
问题描述
关闭屏幕或后台运行时,报:录音结束失败:Attempt to invoke virtual method ‘void android.media.MediaRecorder.stop()’ on a null object reference
2 回复
后来解决了吗?
在uni-app中实现一个支持暂停、继续且不限制录音时长的Android原生录音插件,并确保生成文件小且在应用进入后台后无法启动录音,我们可以使用自定义原生插件的方式来实现。以下是一个简化的代码示例,展示如何实现这些功能。
Android 原生插件代码
1. 创建录音服务
首先,创建一个RecordingService
来处理录音逻辑。
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import java.io.File;
import java.io.IOException;
public class RecordingService extends Service {
private MediaRecorder recorder;
private String fileName;
private boolean isRecording = false;
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void startRecording() {
fileName = Environment.getExternalStorageDirectory().getAbsolutePath() + "/record_" + System.currentTimeMillis() + ".3gp";
recorder = new MediaRecorder();
// 配置MediaRecorder
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(fileName);
try {
recorder.prepare();
recorder.start();
isRecording = true;
} catch (IOException e) {
e.printStackTrace();
}
}
public void pauseRecording() {
if (isRecording) {
recorder.stop();
recorder.reset();
isRecording = false;
}
}
public void resumeRecording() {
if (!isRecording) {
try {
recorder.prepare();
recorder.start();
isRecording = true;
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void stopRecording() {
if (isRecording) {
pauseRecording();
}
recorder.release();
recorder = null;
}
}
2. 处理应用进入后台逻辑
在MainActivity
或应用的入口Activity中监听应用进入后台事件,并停止录音。
@Override
protected void onPause() {
super.onPause();
RecordingService service = ... // 获取或绑定到RecordingService
service.stopRecording();
}
uni-app 调用原生插件
在uni-app中,通过plus.android.importClass
和plus.android.runtimeMainActivity()
等方法调用上述原生服务。
const MainActivity = plus.android.runtimeMainActivity();
const RecordingService = plus.android.importClass('com.example.yourapp.RecordingService');
const service = MainActivity.getSystemService(RecordingService.class);
function startRecording() {
service.startRecording();
}
function pauseRecording() {
service.pauseRecording();
}
function resumeRecording() {
service.resumeRecording();
}
// 注意:在onHide或类似事件中调用stopRecording
function stopRecording() {
service.stopRecording();
}
注意:上述代码仅为示例,实际项目中需要考虑服务绑定、生命周期管理、权限申请等细节。同时,确保在AndroidManifest.xml
中添加必要的权限声明,如RECORD_AUDIO
和WRITE_EXTERNAL_STORAGE
。