2014-01-10 11 views
9

マスターブランチのソースコード全体を https://android.googlesource.com/platform/frameworks/base/+/masterからダウンロードしました。着信コールのイベントチェーンを解読しようとしています。着信コールのシステムレベルではどうなりますか?

私はACTION_ANSWERインテントが開始されていると想定していますが、その前か後に何が起こるかはわかりません。

誰でも手助けできますか?

+0

どのシステムレベルですか?関連するものが巨大なものです:http://www.netmite.com/android/mydroid/development/pdk/docs/telephony.html – zapl

+0

はい私はRILに精通しています。主にApplicationFrameworkのレイヤーに関係しています。それはJavaであり、簡単に変更できるからです。 –

答えて

6

のはCallNotifierを見て、始めましょうです:携帯電話の状態の変化や 様々な他*イベントをリッスン

/** *電話アプリモジュール電話のレイヤーから電話をかけ、 というUIの動作*を引き起こします(リンガーと着信コールの開始のように、 UI、呼び出し中このHandlerが応答メッセージの、*通知を更新するなど、 エントリコールログを書くトーン)*/

一つである:CallStateMonitor.PHONE_NEW_RINGING_CONNECTION

case CallStateMonitor.PHONE_NEW_RINGING_CONNECTION: 
    log("RINGING... (new)"); 
    onNewRingingConnection((AsyncResult) msg.obj); 
    mSilentRingerRequested = false; 
    break; 

結局onNewRingingConnection(AsyncResult)(及び、一般的にはケース)ringAndNotifyOfIncomingCall(Connection c)呼び出し:

private void ringAndNotifyOfIncomingCall(Connection c) { 
    if (PhoneUtils.isRealIncomingCall(c.getState())) { 
     mRinger.ring(); 
    } else { 
     if (VDBG) log("- starting call waiting tone..."); 
      if (mCallWaitingTonePlayer == null) { 
       mCallWaitingTonePlayer = new InCallTonePlayer(
             InCallTonePlayer.TONE_CALL_WAITING); 
       mCallWaitingTonePlayer.start(); 
      } 
    } 

    // CallModeler.onNewRingingConnection(Connection) 
    mCallModeler.onNewRingingConnection(c); 
} 
CallModeler.onNewRingingConnection(Connection)

Link)が取り付けられたリスナーに通知:

for (int i = 0; i < mListeners.size(); ++i) { 
    mListeners.get(i).onIncoming(call); 
} 

これらのリスナーは、CallModeler.Listenerインターフェイスを実装しています。 CallHandlerServiceProxyは、そのようなリスナーであり、そのonIncoming(Call)コールバック火災CallHandlerServiceProxy.processIncoming(Call)

:これは mMainHandlerはケース ON_UPDATE_CALL_WITH_TEXT_RESPONSESを処理する方法である

@Override 
public void onIncoming(Call call, List<String> textResponses) { 
    .... 
    mMainHandler.sendMessage(mMainHandler.obtainMessage(
        ON_UPDATE_CALL_WITH_TEXT_RESPONSES, incomingCall)); 
    .... 
} 

private void processIncoming(Call call) { 
    .... 
    // ICallHandlerService 
    mCallHandlerServiceGuarded.onIncoming(call, 
        RejectWithTextMessageManager.loadCannedResponses()); 
    .... 
} 

CallHandlerServiceICallHandlerService.Stub部材及びそのonIncoming(Call, List<String>)方法がどのように見える定義します

case ON_UPDATE_CALL_WITH_TEXT_RESPONSES: 
    AbstractMap.SimpleEntry<Call, List<String>> entry 
        = (AbstractMap.SimpleEntry<Call, List<String>>) msg.obj; 
    Log.i(TAG, "ON_INCOMING_CALL: " + entry.getKey()); 

    // CallList 
    mCallList.onIncoming(entry.getKey(), entry.getValue()); 
    break; 

CallListCallList.Listenerを実装するリスナーのリストを保持し、CallList.onIncoming(Call, List<String>)メソッドからonIncomingCall(Call)イベントを発生させます。

それでは、InCallPresenterを見てみましょう:

/** *変更の* CallListから更新を受け取り、InCallActivity (UI)を通知します。 * 新しい通話のアクティビティを開始し、すべての通話が* である場合にアクティビティを終了する責任があります。 *通話中状態を作成および管理し、 の通話状態の変更をリスンしたいプレゼンター*のリスナーパターン を提供します。 * TODO:このクラスは、この時点で状態機械 の状態になっています。名前の変更を検討してください。 */

InCallPresenterCallList.Listenerインタフェースを実装し、すべての電話関連の操作のためのUIを提供しInCallActivityを起動する責任があります。 (InCallPresenter.startOrFinishUi(InCallState)から取られた)次のコメントは、一緒にイベントの上記チェーンをもたらします:

/* A new Incoming call means that the user needs to be notified of the 
    the call (since it wasn't them who initiated it). We do this 
    through full screen notifications and happens indirectly through {@link 
    StatusBarListener}. The process for incoming calls is as follows: 

    1) CallList   - Announces existence of new INCOMING call 
    2) InCallPresenter - Gets announcement and calculates that the new 
          InCallState should be set to INCOMING. 
    3) InCallPresenter - This method is called to see if we need to 
          start or finish the app given the new state. 
    4) StatusBarNotifier - Listens to InCallState changes. InCallPresenter 
          calls StatusBarNotifier explicitly to issue a 
          FullScreen Notification that will either start the 
          InCallActivity or show the user a top-level 
          notification dialog if the user is in 
          an immersive app. That notification can also start 
          the InCallActivity.   
    5) InCallActivity - Main activity starts up and at the end of its 
          onCreate will call InCallPresenter::setActivity() 
          to let the presenter know that start-up is complete. 
        [ AND NOW YOU'RE IN THE CALL. voila! ] */ 

私はこれがあなたの質問に答える、または非常に少なくとも願っていますが、どこを見れする方法を示します。私が見落とし/誤解したものは自由に修正してください。

+2

誰が投票したかは良い答えですか? – StarPinkER

1

は、コードの下の希望はあなたを助けるこのGrep code InCallScreen.java

else if (action.equals(Intent.ACTION_ANSWER)) { 
     internalAnswerCall(); 
     app.setRestoreMuteOnInCallResume(false); 
     return InCallInitStatus.SUCCESS; 
+0

ありがとうございます。それはAndroidのもっと古いバージョンです。 KitKatはどうですか? InCall Screenが変更されたようです –

1

を見てみましょう。

@Override 
    public void onCallStateChanged(int state, String incomingNumber) { 
     super.onCallStateChanged(state, incomingNumber); 
     switch(state){ 
     case TelephonyManager.CALL_STATE_IDLE: 
      //Not in call: Play music 

      break; 
     case TelephonyManager.CALL_STATE_OFFHOOK: 
      //A call is dialing, active or on hold 

      break; 
     case TelephonyManager.CALL_STATE_RINGING: 
      //Incoming call: Pause music 

      break; 

     }    
    } 

Googleの参照が
http://developer.android.com/reference/android/telephony/TelephonyManager.html

関連する問題