之前没有想过写什么东西,这几天才学习cordova 用了一些插件,但是在某度搜索的回答你们都懂的 80%都是各种转帖,没找到什么实质性的东西。怕忘了这段代码 我就注册了一个帐号分享一下。希望能够帮助到我一样的新手。
功能是录音,然后本地通知时候,点击页面后自动播放录音。
最开始我选择了media-capture这个插件 比较丑但是基本可以完成录音功能。后来在一个人的博客中我看到了media插件 发现他比media-capture的插件更灵活一些,改用了这个
先cordova add插件 这个我不说了 命令一大堆,废话儿不说了 上码!!!
$("#alertAudio").on("touchstart",function(){
//实例化录音类
start();
//开始录音
mediaRec.startRecord();
//$("#test").html("开始录音");
});
var mediaRec;
function start(){
//定义录音文件保存名称及位置
global.alertAudio =new Date().getTime()+ "test.wav";
//实例化录音类
mediaRec = new Media(global.alertAudio,
// 录音执行函数
function() {
console.log("start():Audio Success");
},
// 录音失败执行函数
function(err) {
console.log("start():Audio Error: "+ err.code);
}
);
}
});
$("#alertAudio").on("touchmove",function(e){
//这里很关键,如果手势移动会执行另外一个操作,录音就会终止,所以此处需要禁止移动的默认操作。
e.preventDefault();
//date3 =new Date();
//$("#test").html("滑动了"+(date3.getTime()-date1.getTime())/1000);
});//为按钮绑定 touchend(手势离开)事件
$("#alertAudio").on("touchend",function(){
//结束录音
mediaRec.stopRecord();
//释放系统底层的音频播放资源
mediaRec.release();
//需要播放的录音的路径
// //实例化录音类
mediaRec = new Media(global.alertAudio,
// 成功操作
function() {
console.log("start():Audio Success");
},
// 失败操作
function(err) {
console.log("start():Audio Error: "+ err.code);
}
);
//在html中显示当前状态
//$("#test")音
mediaRec.play();
//upload to Server
//获取录音文件上传到服务器
window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, nFileSystemSuccess, fail);
//在html中显示当前状态
//$("#test").append("--开始播放录音");
});
function nFileSystemSuccess(filesystem)
{
//filesystem.root.nativeURL是录音文件的完整路径+我自定义的文件名称
global.alertAudio=filesystem.root.nativeURL+global.alertAudio;
var options = new FileUploadOptions();
options.fileKey = "file";
options.fileName = global.alertAudio.substr(global.alertAudio.lastIndexOf('/')+1);
options.mimeType = "audio/wav";
var params = new Object();
params.strutsUploadsFileName = global.alertAudio.substr(global.alertAudio.lastIndexOf('/')+1);
options.params = params;
options.chunkedMode=false;
var ft = new FileTransfer();
// 上传到服务器
ft.upload(global.alertAudio, global.host + '/uploadOther.do', winAudio, fail, options);
}
function winAudio(r){
var dateObj = eval("(" + r.response + ")");
//返回文件的上传路径
var _url=global.host+dateObj.resUrl;
//下载到ios沙盒文件中
localFile(_url);
}
function downloadPic(sourceUrl,targetUrl){
var fileTransfer = new FileTransfer();
var uri = encodeURI(sourceUrl);
fileTransfer.download(
uri,targetUrl,function(entry){
global.alertAudio = "doc:/"+entry.fullPath;
},function(error){
console.log("下载网络图片出现错误");
});
}
function localFile(_url) {
var _localFile = "file_mobile/caas.wav";//目标文件
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem){
//创建目录
fileSystem.root.getDirectory("file_mobile", {create:true},
function(fileEntry){ },
function(){ console.log("创建目录失败");});
//查找文件
fileSystem.root.getFile(_localFile, null, function(fileEntry){
//文件存在就直接显示
global.alertAudio="documents:/"+fileEntry.fullPath;
}, function(){
//否则就到网络下载图片!
fileSystem.root.getFile(_localFile, {create:true}, function(fileEntry){
var targetURL = fileEntry.toURL();
downloadPic(_url,targetURL);
},function(){
alert('下载图片出错');
});
});
}, function(evt){
console.log("加载文件系统出现错误");
});
}
整体的代码就是这样, 思路就是先录音 录音文件生成以后,拿到生成的文件上传到服务器 然后在下载到本地,我的业务逻辑是这样,认为麻烦的可以剩去上传服务器步骤,我完全是为了以后扩展用的。这些代码其实网上都是有的 我要说的是大家注意我遇到的坑
1,录音文件生成在临时目录中 所以获取文件路径的时候要用LocalFileSystem.TEMPORARY
2 , 下载到沙盒中的时候,需要给文件路径 如果没有就要会创建文件,这块文件路径我们最好进入最里面文件创建一个文件,如果路径的上层文件没有就会报错, 所以要创建多层目录文件要用递归
3,播放时候的路径 按照我的代码 应该是new media("documents://文件名称"); 因为我打开应用程序的目录发现document首字母是大写的,不要管他 直接用小写ok
4,global.alertAudio是公共变量 我要最后复制给本地通知的声音路径 大家可以忽略不记。