目录

概述

本插件的主要功能是提供录制、播放音频文件和控制音量等功能。

JS调用方法

1、导入插件require(“cordova!cordova-plugin-media”);
2、本文对应的插件demo用了四个方法:

  • play:播放音频文件
  • stop:停止播放
  • startRecord:开始录音
  • stopRecord:结束录音
define(function(require) {
	var $ = require("jquery");
	var justep = require("$UI/system/lib/justep");
	require("$UI/system/lib/cordova/cordova");
	require("css!$UI/demo/device/common/pub").load();
	require("cordova!cordova-plugin-media");

	var Model = function() {
		this.callParent();
		this.mediaTimer;
		this.mediaRec;
		this.fileName;
		this.timeLen;
		this.operateType;
		this.STORE_ID = "com.justep.demo.advice.audiodata";
		this.openByDialog = false;
	};

	Model.prototype.modelLoad = function(event) {
		var me = this;
		document.addEventListener("deviceready", onDeviceReady, false);
		// 加载完成
		function onDeviceReady() {
			me.comp("audioBtn").set({disabled: false});
			me.comp("playBtn").set({disabled: false});

			if(localStorage.getItem(me.STORE_ID) != "")
				me.comp("fileData").loadData(JSON.parse(localStorage.getItem(me.STORE_ID)));
		}
	};
	
	// 关闭功能
	Model.prototype.backBtnClick = function(event) {
		if(this.mediaRec)
			this.mediaRec.stop();
		
		localStorage.setItem(this.STORE_ID, JSON.stringify(this.comp("fileData").toJson(false)));
		
		if(this.openByDialog)
			this.comp("windowReceiver").windowCancel();
		else
			justep.Shell.closePage();
	};
	
	// 录音
	Model.prototype.audioBtnClick = function(event) {
		this.comp("recordCover").show();

		this.comp('titleOutput').set({value: "开始录音!"});
		this.comp('fileOutput').set({value: "aaa"});
		this.comp('recordTime').set({value: "00:00:00"});
             
		var me = this;
		// 根据系统时间产生文件名
		this.fileName = justep.Date.toString(new Date(), "yyyyMMddhhmmss") + ".wav";
		this.mediaRec = new Media(this.fileName,
				function() {
				},
				function(err) {
					me.comp('fileOutput').set({value: "失败:" + err});
				}
		);
		// 开始录音
		this.mediaRec.startRecord();
		this.operateType = "record";
		
		var recTime = 0;
		this.mediaTimer = setInterval(function() {
			recTime = recTime + 1;
            me.setAudioPosition(recTime);
            me.comp('recordTime').set({value: me.timeLen});
		}, 1000);
	};
	
	//设置显示的时间
    Model.prototype.setAudioPosition = function(position) {
    	var hour = parseInt(position / 3600);// 小时数
		var min = parseInt(position / 60);// 分钟数
		if (min >= 60) {
			min = min % 60
		}
		var lastsecs = position % 60;
		if(hour < 10) hour = "0" + hour;
		if(min < 10) min = "0" + min;
		if(lastsecs < 10) lastsecs = "0" + lastsecs;
		
		this.timeLen = hour + ':' + min + ':' + lastsecs;
    }
    
    //停止播放、停止录音
	Model.prototype.pauseImageClick = function(event){
		// 清空计时器
		clearInterval(this.mediaTimer);
		if (this.operateType == "record") {
			// 停止录音
			this.comp("recordCover").hide();
			this.mediaRec.stopRecord();
			
			var data = this.comp("fileData");
			data.newData({index : 0});
			data.setValue("fileName", this.fileName);
			data.setValue("createTime", justep.Date.toString(new Date(), justep.Date.DEFAULT_FORMAT))// 开始时间
			data.setValue("timeLen", this.timeLen);// 录音时长
			
			this.comp('fileOutput').set({value: "音频文件名"+this.fileName});
		}else{
			//停止播放
			this.comp("playCover").hide();
			this.mediaRec.stop();
		}
	};
	
	// 播放录音
	Model.prototype.fileListClick = function(event) {
		this.comp("playCover").show();
		this.comp('titleOutput').set({value: "播放录音!"});
		this.comp('fileOutput').set({value: ""});
		
		var me = this;
		var data = this.comp("fileData");
		var url = data.getValue("fileName");
		this.comp('playTime').set({value: "00:00:00||" + data.getValue("timeLen")});
                //在播放前需要加载音频文件
		this.mediaRec = new Media(url,
				function() {
				},
				function(err) {
					me.comp('fileOutput').set({value: "失败:" + err});
				}
		);
		// 播放音频
		this.mediaRec.play();
		this.operateType = "play";
		
		var recTime = 0;
		this.mediaTimer = setInterval(function() {
			recTime = recTime + 1;
            me.setAudioPosition(recTime);

			if(me.timeLen == data.getValue("timeLen")){
				me.comp("playCover").hide();
				clearInterval(me.mediaTimer);

				me.comp('fileOutput').set({value: "完毕"});
			}
			me.comp('playTime').set({value: me.timeLen + "||" + data.getValue("timeLen")});
		}, 1000);
	};

	// 清空历史记录
	Model.prototype.deleteBtnClick = function(event) {
		this.comp("fileData").clear();
		this.comp('titleOutput').set({value: "清空历史记录"});
		this.comp('fileOutput').set({value: ""});
		localStorage.setItem(this.STORE_ID, "");
	};
	
	// 播放音乐
	Model.prototype.playBtnClick = function(event) {
		this.comp('titleOutput').set({value: "播放音乐!"});
		this.comp('fileOutput').set({value: ""});
		var me = this;
		
		var src = window.location.origin + require.toUrl("$UI/demo/device/audio/music.mp3");
                //在播放前需要加载mp3文件
		this.mediaRec = new Media(src,
				function(optio) {
					me.comp('fileOutput').set({value: "完毕"});
				},
				function(err) {
					me.comp('fileOutput').set({value: "失败:" + err});
				}
		);
		this.mediaRec.play();
	};

	Model.prototype.windowReceiverReceive = function(event){
		this.openByDialog = true;
	};

	Model.prototype.modelUnLoad = function(event){
		clearInterval(this.mediaTimer);
	};

	return Model;
});

注意事项

1、 在安卓系统如果当前app存储位置在MEDIA_MOUNTED(SD卡),音频文件会被存储到”外部存储路径”+”/”目录下,否则存在”/data/data/app包名”+”/”目录下,文件名需要自己定义。在IOS系统中,录音文件名只支持wav格式,写成其它格式会报错,文件名可以写成全路径也可以只写文件名,插件自动补全路径。全路径为该应用下的”documents/tmp”。也可用使用cordova的file插件将目录写成cordova.file.LocalFileSystem.TEMPORARY。需要注意的是指定的路径在开始录音之前必须存在,否则会引发异常报错。
2、 播放音频文件之前要先加载文件路径。
3、 本文实例所用的demo在\model\UI2\demo\native\audio目录下,可以自行打包查看效果。