记得拿到这个需求的时候,还是两年前。当时ai还没有现在这么强大,很多资料查起来都不全,而且稀奇古怪。 后面基本都是自己翻安卓文档,一点一点的实现的,😂。
APP完整代码已开源,提供mock接口,可直接打包运行。
开发 安卓很早以前没办法通过系统应用之外的应用来实现通话录音了,现有的通话录音实现方案,基本都是强制用户开启手机自带的通话录音。
然后APP再去读取系统录音文件,实现上传。
安卓原生实现起来,感觉挺方便的,但是uniapp来实现的话,就多了很多弯弯绕绕。
各种艰辛也忘的差不多了,只记得需求都很好的实现了,今天再回过头来,踩过的坑也依然历历在目。
第一坑 h5+的API限制了用户读取手机文件的权限,想要读取应用目录之外的文件,实现不了。只能用native.js调用java反射的各种对象去读取系统文件。
let File = plus.android.importClass(“java.io.File”); let Dirs = new File(Dir); let temp = Dirs.listFiles();
第二坑 然后更坑的是,好不容易反射拿到文件对象了,该怎么上传呢?
- 通过h5+
const task = plus.uploader.createUpload(
${api.add_audio}?id=${param}
, { method: “POST”, priority: 100 }, (ob, status) => { resolve({ ob, code: status }); } ); /* 添加待上传的文件 */ task.addFile(“file://” + filePath, {key: “file”}); task.start();
这个是最合适的,但是h5+的api只能上传应用目录下的文件,系统文件压根不让传。
- js 通过nativa.js反射读取java文件流,只能一个字节一个字节的获取,读取巨慢!几百kb都得几分钟,😂。
印象中这是最难的一步,当时已经快放弃了,😂。
let FileInputStream = plus.android.importClass(“java.io.FileInputStream”); let reader = new FileInputStream(file);
最后想着把文件复制到应用目录,再通过H5+上传。
然后试了一下一个文件流读,写到另一个文件流,也是巨慢
然后去复习了一下学过的java基础,发现了***,实现起来又快又好。
let appFile = plus.android.runtimeMainActivity().getApplicationContext().getFilesDir().getPath(); //应用目录 let reader = new FileInputStream(file); let temp = appFile + “/” + (new Date()).getTime() + “.mp3”; let out = new FileOutputStream(temp); let fisChannel = reader.getChannel(); let fosChannel = out.getChannel(); /* 将fisChannel通道的数据,写入到fosChannel通道 */ fisChannel.transferTo(0, fisChannel.size(), fosChannel); reader.close(); out.close();
最后就是调用h5+上传录音,上传了再顺手清理掉。到这一步,核心都已经完成了。已经可以通过这些来完善的业务逻辑了。
结语 具体的细节还有挺多的,比如如何获取对应手机的录音文件路径、如何读取通时通次。上班的摸鱼时间有限,就不一一赘叙,可以参考上述的开源项目