cordova-plugin-background-mode cordova-plugin-media實現APP在後臺運行時僅Android發起語音播報

添加插件:

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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章