來電界面與響鈴同步問題

由于Google 默認設計中來電鈴聲一路和UI啟動一路是分開跑誊爹,通常情形下UI一路的啟動要比響鈴更耗時間睛蛛;所以會存在來電界面起來比鈴聲稍晚的用戶體驗皂甘,尤其是在滅屏時候的來電鲜滩。下面的Workround方法給出了L版本上對于此問題的優(yōu)化方案搅窿。
Telecom將來電響鈴的邏輯屏蔽,InCallPresenter在收到來電消息時廊镜,判斷當前是否是亮屏狀態(tài)牙肝,如果是亮屏狀態(tài),InCall調(diào)用底層的方法進行響鈴.
如果是黑屏嗤朴,在收到來電消息的時候配椭,不做響鈴操作,在進入到InCallActivity(通話界面)的onResume方法中雹姊,調(diào)用響鈴的方法股缸。

在InCallPresenter.java中,進行以下修改:
a.增加以下引用

import android.os.PowerManager;// Add For synchronize ringer and UI

b. 增加成員

private PowerManager pm = null;
private boolean isInCallActivityStop = false;

c. 增加方法 playIncomingCallRingtone(android.telecom.Call call)

   /**
     * Add For synchronize ringer and UI
     *
     * @param call
     */
    public void playIncomingCallRingtone(android.telecom.Call call){
        Log.i(this, "playIncomingCallRingtone()");
        TelecomAdapter.getInstance().playIncomingCallRingtone(call);
    }

d.增加getPowerManager方法

public PowerManager getPowerManager(){
     if(pm == null){
           pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
     }
      return pm;
}

e. 修改onIncomingCall(Call call)方法

public void onIncomingCall(Call call) {
       Log.i(this, " onIncomingCall set isInCallActivityStop = false ");
       isInCallActivityStop = false;
       InCallState newState = startOrFinishUi(InCallState.INCOMING);
       InCallState oldState = mInCallState
       Log.i(this, "Phone switching state: " + oldState + " -> " + newState);
       mInCallState = newState;
       //begin Add For synchronize ringer and UI
         Log.d(this, "onIncomingCall the screen is on ? ----- " + getPowerManager().isScreenOn());
         if(getPowerManager().isScreenOn()){
                Log.d(this, "onIncomingCall the screen is on!");               
                playIncomingCallRingtone(call.getTelecommCall());
         }
         //end Add For synchronize ringer and UI

       for (IncomingCallListener listener : mIncomingCallListeners) {
           listener.onIncomingCall(oldState, mInCallState, call);
       }
   }

f.

public void setInCallActivityStop (boolean isStop ){
      Log.d(this, " setInCallActivityStop : " + isStop);
      isInCallActivityStop = isStop;
}

g.

public boolean getInCallActivityStop ( ){
      Log.d(this, " getInCallActivityStop: " + isInCallActivityStop);
       return: isInCallActivityStop;
}

2.TelecomAdapter.java中增加方法playIncomingCallRingtone(android.telecom.Call call)

//Add For synchronize ringer and UI

void playIncomingCallRingtone(android.telecom.Call call) {

       if (mPhone != null) {
               Log.d(this, "playIncomingCallRingtone() Call:" + call);
               if (call != null) {
                     call.playIncomingCallRingtone();
               } else {
                     Log.e(this, "error playIncomingCallRingtone, call is null");
               }
       } else {
           Log.e(this, "error playIncomingCallRingtone, mPhone is null");
       }     
   }

3.Call.java(frameworks\base\telecomm\java\android\telecom)增加方法playIncomingCallRingtone():

 //Add For synchronize ringer and UI
public void playIncomingCallRingtone() {
     mInCallAdapter.playIncomingCallRingtone();
} 

4.InCallAdapter.java(frameworks\base\telecomm\java\android\telecom)增加方法playIncomingCallRingtone():


   /**
     * Add For synchronize ringer and UI
     *
     */
   public void playIncomingCallRingtone() {
       try {
           mAdapter.playIncomingCallRingtone();
       } catch (RemoteException e) {
       }
   }

5.IInCallAdapter.aidl(frameworks\base\telecomm\java\com\android\internal\telecom)文件中增加接口:void playIncomingCallRingtone();

6.InCallAdapter.java(packages\services\telecomm\src\com\android\server\telecom)

1> 增加靜態(tài)成員:
      //Add For synchronize ringer and UI
       private static final int MSG_PLAY_INCOMING_RINGTONE = 1008;
 2> InCallAdapterHandler的handleMessage()方法的最后添加:
      case MSG_PLAY_INCOMING_RINGTONE:
            mCallsManager.playIncomingCallRingtone();
       break;
 3> 添加成員方法:
       @Override
       public void playIncomingCallRingtone() {                               
          mHandler.obtainMessage(MSG_PLAY_INCOMING_RINGTONE).sendToTarget();
       }

7.CallsManager.java 中增加方法playIncomingCallRingtone()

//Add For synchronize ringer and UI
public void playIncomingCallRingtone(){
      Log.v(this, "playIncomingCallRingtone()");
      // check whether exist RINGING call.
      for(Call call : mCalls) {
              if(call.getState() == CallState.RINGING) {
                    mRinger.startRingingOrCallWaiting();//修改該方法為Public
                    break;
                }
       }
}

8.Ringer.java(packages\services\telecomm\src\com\android\server\telecom)中修改onForegroundCallChanged()方法如下:

   @Override
   public void onForegroundCallChanged(Call oldForegroundCall, Call newForegroundCall) {
       if (mRingingCalls.contains(oldForegroundCall) ||
               mRingingCalls.contains(newForegroundCall)) {
                 // Add For synchronize ringer and UI
                 Log.v(this, "synchronize onForegroundCallChanged() ");
                 //End
                 //Original code 
                 //updateRinging();
       }
   }

9.InCallactivity.java
a. 增加以下引用

import android.os.PowerManager;// Add For synchronize ringer and UI

b.

protected void onCreate(Bundle icicle) {
       Log.d(this, "onCreate()... this = " + this);
       super.onCreate(icicle);
       ......
       //begin Add For synchronize ringer and UI
       Log.d(this, "AAAscreen is on ? ----- " +InCallPresenter.getInstance().getPowerManager().isScreenOn());
       //end Add For synchronize ringer and UI                       
       Log.d(this, "onCreate(): exit");
   }

c.

protected void onResume() {
    ......
    InCallPresenter.getInstance().lightOnScreenForSmartBook();                           
    //begin Add For synchronize ringer and UI
    final PowerManager pm = InCallPresenter.getInstance().getPowerManager();
    final Call call = CallList.getInstance().getIncomingCall();
    Log.d(this, "onResum:call: " + call);
    if(call != null){
        boolean isInCallActivityStop =     InCallPresenter.getInstance().getInCallActivityStop();
        Log.d(this, "BBBscreen is on ? ----- " + pm.isScreenOn());
        Log.d(this, "BBBscreen call.getState(): " + call.getState() + " isInCallActivityStop: " + isInCallActivityStop);           
        if((call.getState() == Call.State.CALL_WAITING)
        ||((call.getState() == Call.State.INCOMING)&&(pm.isScreenOn() &&           isInCallActivityStop))){
            InCallPresenter.getInstance().playIncomingCallRingtone(call.getTelecommCall());                         
            InCallPresenter.getInstance().setInCallActivityStop(false);                                                                       
        }
    }             
//end Add For synchronize ringer and UI
}

d.

protected void onStop() {
       Log.d(this, "onStop()...");
        ……………
       super.onStop();
       InCallPresenter.getInstance().setInCallActivityStop(true);
}
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吱雏,一起剝皮案震驚了整個濱河市敦姻,隨后出現(xiàn)的幾起案子瘾境,更是在濱河造成了極大的恐慌,老刑警劉巖镰惦,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迷守,死亡現(xiàn)場離奇詭異,居然都是意外死亡陨献,警方通過查閱死者的電腦和手機盒犹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眨业,“玉大人急膀,你說我怎么就攤上這事×浼瘢” “怎么了卓嫂?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長聘殖。 經(jīng)常有香客問我晨雳,道長,這世上最難降的妖魔是什么奸腺? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任餐禁,我火速辦了婚禮,結(jié)果婚禮上突照,老公的妹妹穿的比我還像新娘帮非。我一直安慰自己,他們只是感情好讹蘑,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布末盔。 她就那樣靜靜地躺著,像睡著了一般座慰。 火紅的嫁衣襯著肌膚如雪陨舱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天版仔,我揣著相機與錄音游盲,去河邊找鬼。 笑死蛮粮,一個胖子當著我的面吹牛益缎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蝉揍,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼畦娄!你這毒婦竟也來了又沾?” 一聲冷哼從身側(cè)響起弊仪,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杖刷,沒想到半個月后励饵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡滑燃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年役听,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片表窘。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡典予,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乐严,到底是詐尸還是另有隱情瘤袖,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布昂验,位于F島的核電站捂敌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏既琴。R本人自食惡果不足惜占婉,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甫恩。 院中可真熱鬧逆济,春花似錦、人聲如沸填物。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽滞磺。三九已至升薯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間击困,已是汗流浹背涎劈。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留阅茶,地道東北人蛛枚。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像脸哀,于是被迫代替她去往敵國和親蹦浦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容