添加插件:
cordova plugin add cordova-plugin-media
cordova plugin add cordova-plugin-background-mode
然後對資源實例化:
angular.module('xlfdMedia', []).factory('mediaFactory', [
'$window',
'$q',
function($window, $q) {
var audio = (function(Media) {
return (function() {
var ready,
realMedia = [],
extUrl,
initPoolList,
// 標記播放“多筆到賬”
numsSign = -1,
// 多條通知界限,超過這個值則播報“您有多筆收款。。。”
overNum = 3,
// 初始池持續時間
initTime = 1500,
// 播放鎖
lockProcess = false,
// 判斷設備
// isIos = window.JPush && window.JPush.isPlatformIOS(),
isAndroid = ionic.Platform && ionic.Platform.isAndroid(),
durationName = isAndroid ? 'duration_android' : 'duration_ios';
var WAN = 10000,
QIAN = 1000,
BAI = 100,
SHI = 10;
var audioList = [];
// 語音文件路徑與語音文件需用時間的鉤子
var audios = {
zero: {
src: 'media/0.mp3',
duration_android: 550,
duration_ios: 550
},
one: {
src: 'media/1.mp3',
duration_android: 550,
duration_ios: 550
},
two: {
src: 'media/2.mp3',
duration_android: 550,
duration_ios: 550
},
three: {
src: 'media/3.mp3',
duration_android: 550,
duration_ios: 550
},
four: {
src: 'media/4.mp3',
duration_android: 550,
duration_ios: 550
},
five: {
src: 'media/5.mp3',
duration_android: 550,
duration_ios: 550
},
six: {
src: 'media/6.mp3',
duration_android: 550,
duration_ios: 550
},
seven: {
src: 'media/7.mp3',
duration_android: 550,
duration_ios: 550
},
eight: {
src: 'media/8.mp3',
duration_android: 550,
duration_ios: 550
},
nine: {
src: 'media/9.mp3',
duration_android: 550,
duration_ios: 550
},
point: {
src: 'media/point.mp3',
duration_android: 650,
duration_ios: 650
},
ten: {
src: 'media/ten.mp3',
duration_android: 600,
duration_ios: 600
},
hd: {
src: 'media/hd.mp3',
duration_android: 650,
duration_ios: 650
},
td: {
src: 'media/td.mp3',
duration_android: 650,
duration_ios: 650
},
ttd: {
src: 'media/ttd.mp3',
duration_android: 650,
duration_ios: 650
},
hm: {
src: 'media/hm.mp3',
duration_android: 650,
duration_ios: 650
},
yuan: {
src: 'media/yuan.mp3',
duration_android: 650,
duration_ios: 650
},
it: {
src: 'media/it.mp3',
duration_android: 650,
duration_ios: 650
},
get: {
src: 'media/get.mp3',
duration_android: 1500,
duration_ios: 1500
},
lot: {
src: 'media/lot.mp3',
duration_android: 3800,
duration_ios: 3800
}
};
// 數字轉換成語音文件的數組方案
var unitsInWan = ['', audios.ten, audios.hd, audios.td];
var unitsUpWan = ['', audios.ttd, audios.hm, audios.ttd];
var units = [
audios.zero,
audios.one,
audios.two,
audios.three,
audios.four,
audios.five,
audios.six,
audios.seven,
audios.eight,
audios.nine
];
var unitsOther = {
point: audios.point,
yuan: audios.yuan,
it: audios.it,
get: audios.get
};
document.addEventListener('deviceready', function() {
// 允許後臺運行cordova-plugin-backgroun-mode
cordova.plugins.backgroundMode.enable();
ready = true;
if (!isAndroid) {
// iOS
extUrl = './';
} else {
// Android
extUrl = cordova.file.applicationDirectory + 'www/';
}
Media = Media.Media;
});
return {
start: start,
getArrayByNumber: getArrayByNumber
};
function mediaPluginCenterDeal(defer) {
if (!ready) {
defer.reject('設備未準備好!');
return false;
}
if (!Media) {
defer.reject('media未準備好!');
return false;
}
return true;
}
// 開始語音
function start(number) {
var defer = $q.defer();
if (mediaPluginCenterDeal(defer)) {
initPool(number);
}
}
// 初始池
function initPool(num) {
if (!!initPoolList) {
initPoolList.push(num);
} else {
initPoolList = [];
initPoolList.push(num);
setTimeout(function() {
audioList = audioList.concat(initPoolList);
initPoolList = undefined;
startProcess();
}, initTime);
}
}
// 播報啓動處理
function startProcess() {
if (!lockProcess && audioList.length > 0) {
lockProcess = true;
try {
if (audioList.length > overNum) {
audioList = [];
audioList.push(numsSign);
}
startAAudio(audioList[0]);
} catch (e) {
lockProcess = false;
}
}
}
// 拋出處理
function throwData() {
if (audioList.shift() === numsSign) {
audioList = [];
}
}
// 播放語音
function startAAudio(number) {
audiosArr = getArrayByNumber(number);
loadMedia();
setTimeout(function() {
playList(0);
}, 10);
// 先加載音頻資源
function loadMedia() {
realMedia = [];
for (var i = 0; i < audiosArr.length; i++) {
realMedia[i] = new Media(extUrl + audiosArr[i].src);
}
}
// 釋放音頻資源
function releaseMedia() {
realMedia = [];
}
// 播放語音列表
function playList(index) {
realMedia[index].play({
numberOfLoops: 1,
playAudioWhenScreenIsLocked: true
});
setTimeout(function() {
setTimeout(function() {
realMedia[index].stop();
realMedia[index].release();
}, 10);
if (audiosArr[index + 1]) {
playList(index + 1);
} else {
releaseMedia();
throwData();
lockProcess = false;
startProcess();
}
}, audiosArr[index][durationName]);
}
}
// 獲取數字轉語音文件的隊列
function getArrayByNumber(num) {
if (num === numsSign) {
return [audios.lot];
}
num = num + '';
if (/^(0|[1-9]\d*)(.\d*[1-9])?$/.test(num)) {
var nums = num.split('.'),
pointAfter = nums[1],
flag = 0;
num = Number(nums[0]);
num = dealNum(num);
num.unshift(unitsOther.get);
if (pointAfter) {
nums = pointAfter.split('');
num.push(unitsOther.point);
nums.map(function(val) {
num.push(units[Number(val)]);
});
num.push(unitsOther.yuan);
} else {
num.push(unitsOther.yuan);
num.push(unitsOther.it);
}
if (num[1] === audios.one && num[2] === audios.ten) {
num.splice(1, 1);
}
return num;
} else {
return [audios.zero];
}
}
// 獲取萬以上的解析數組
function dealNum(num) {
var currNum,
level = 0;
var arr = [],
arrTemp,
addZero;
if (num === 0) {
return [units[0]];
}
while (num > 0) {
currNum = num % WAN;
if (currNum) {
if (addZero) {
arr.unshift(units[0]);
}
if (level === 2) {
arr = [unitsUpWan[2]].concat(arr);
} else if (level) {
arr = [unitsUpWan[1]].concat(arr);
}
arrTemp = dealNumInWan(currNum);
addZero = arrTemp[0];
arr = arrTemp[1].concat(arr);
}
level++;
num = Math.floor(num / WAN);
}
return arr;
}
// 獲取萬以內的解析數組
function dealNumInWan(num) {
var zero,
firstIsZero = num / QIAN < 1 && num > 0;
var arr = [],
currNum,
unit = 0;
while (num > 0) {
currNum = num % SHI;
if (currNum) {
zero === undefined && (zero = false);
if (unit) {
if (zero) {
arr.unshift(units[0]);
zero = false;
}
arr.unshift(unitsInWan[unit]);
}
arr.unshift(units[currNum]);
} else {
zero === false && (zero = true);
}
unit++;
num = Math.floor(num / SHI);
}
return [firstIsZero, arr];
}
})();
})($window);
return {
audio: audio
};
}
]);
在controller引入mediaFactory模塊,然後調用:
mediaFactory.audio.start(0.01);