uni-app Android原生录音插件支持暂停继续且不限制录音时长 生成文件小 进入后台后无法启动录音

发布于 1周前 作者 yibo5220 来自 uni-app

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.importClassplus.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_AUDIOWRITE_EXTERNAL_STORAGE

回到顶部