uni-app Android原生录音插件支持暂停继续且不限制录音时长 生成文件小 进入后台后无法启动录音
uni-app Android原生录音插件支持暂停继续且不限制录音时长 生成文件小 进入后台后无法启动录音
问题描述
关闭屏幕或后台运行时,报:录音结束失败:Attempt to invoke virtual method ‘void android.media.MediaRecorder.stop()’ on a null object reference
后来解决了吗?
更多关于uni-app Android原生录音插件支持暂停继续且不限制录音时长 生成文件小 进入后台后无法启动录音的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在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。
 
        
       
                     
                   
                    

