【MUI】Android監聽電話呼入呼出

序章

還記得嗎?在前段時間,咱們擼過了h5的video標籤元素,和h5+的plus特性編寫了一個小小的播放器。至今位置改了一些代碼運用到了項目中,卻發現出現了一個蛋疼的問題。html

Android : 後臺,鎖屏,來電都不能自動暫停,哭瞎 T-T。
ios : 後臺,鎖屏,來電,都會自動暫停。得益於蘋果的系統限制,以上狀況下都會暫停音視頻的播放。html5

搞起

先來分析一波,後臺事件,5+的文檔中早已出現過。android

document.addEventListener('pause',function(){
              //code...
              //暫停播放
          });

這裏須要跟你們提醒下document.addEventListener千萬不要寫成window.addEventListener由於我就寫錯了一次,我說怎麼調試都不成功。哈哈ios

再來再來,下一個下一個,鎖屏是吧,我一開始在官方文檔中翻了一下子並無發現有這個事件,後來仔細想一想,鎖屏的時候,不就正是另外一個叫作‘鎖屏’的應用程序切換到了前臺,而咱們的App切換到了後臺嗎?
果不其然,不須要增長額外的事件,監聽了上面的後臺事件便可,也會觸發。ide

SO,視頻播放中,來電話了,視頻並不會暫停? Excuse Me?若是是我還好,看一些美劇什麼的(
強勢推薦你們看:《閃電俠》

咳咳,要是別人在看一些那啥怎麼辦,orz 。這就很尷尬了,當初並無想到Android來電不會自動暫停H5 video的播放。函數

一時間找文檔也沒有發現 來電事件ui

好吧,拿起Native.js大寶劍.net

1:打開 Native.js 文檔 Native.js
2:打開 Native.js 範例 Native範例彙總
3:打開 baidu.com 搜索 關鍵字 android 來電監聽調試

差很少就這些了,就算我這樣不怎麼懂原生的菜鳥,仍是照葫蘆畫瓢,約摸着寫出來點。code

var Native = (function($) {
    var native = {};
    var receiver, main, context, TelephonyManager;
    
    native.listenTelPhone = function(callback) {
        
        $.plusReady(function() {
            context = plus.android.importClass('android.content.Context'); //上下文
            TelephonyManager = plus.android.importClass('android.telephony.TelephonyManager'); //通話管理
            main = plus.android.runtimeMainActivity(); //獲取activity
            receiver = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {
                onReceive: doReceive //實現onReceiver回調函數
            });
            var IntentFilter = plus.android.importClass('android.content.IntentFilter');
            var Intent = plus.android.importClass('android.content.Intent');
            var filter = new IntentFilter();
            
            filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); //監聽電話狀態
            main.registerReceiver(receiver, filter); //註冊監聽
        });

        function doReceive(context, intent) {
            plus.android.importClass(intent);

            var phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER),
                telephony = context.getSystemService(context.TELEPHONY_SERVICE),
                state = telephony.getCallState();
            switch(state) {
                case TelephonyManager.CALL_STATE_RINGING:
                    callback && callback(1,phoneNumber);
                    //console.log("[Broadcast]等待接電話=" + phoneNumber);
                    break;
                case TelephonyManager.CALL_STATE_IDLE:
                    callback && callback(0,phoneNumber);
                    console.log("[Broadcast]電話掛斷=" + phoneNumber);
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    callback && callback(2,phoneNumber);
                    console.log("[Broadcast]通話中=" + phoneNumber);
                    break;
            }
        }
    },
    native.removeListenTelPhone = function(){
        if(receiver){
            main = plus.android.runtimeMainActivity(); //獲取activity
            main.unregisterReceiver(receiver); //刪除監聽
            receiver = null;
        }
    }

    return native;
}(mui));

暴露出2個方法,添加來電監聽廣播,以及刪除。

//監聽電話 code 1來電 0掛斷 2童話中    number 對方電話號碼
    mui.os.android && Native.listenTelPhone(function(code, number) {
        if(code === 1) { //來電
            //暫停播放
            //code...
        }
    });

    //去除電話廣播監聽
    mui.os.android && Native.removeListenTelPhone();

嘿嘿嘿嘿,嘿嘿嘿嘿

相關文章
相關標籤/搜索