マスターブランチのソースコード全体を https://android.googlesource.com/platform/frameworks/base/+/masterからダウンロードしました。着信コールのイベントチェーンを解読しようとしています。着信コールのシステムレベルではどうなりますか?
私はACTION_ANSWERインテントが開始されていると想定していますが、その前か後に何が起こるかはわかりません。
誰でも手助けできますか?
マスターブランチのソースコード全体を https://android.googlesource.com/platform/frameworks/base/+/masterからダウンロードしました。着信コールのイベントチェーンを解読しようとしています。着信コールのシステムレベルではどうなりますか?
私はACTION_ANSWERインテントが開始されていると想定していますが、その前か後に何が起こるかはわかりません。
誰でも手助けできますか?
のは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());
....
}
CallHandlerServiceはICallHandlerService.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;
CallListはCallList.Listener
を実装するリスナーのリストを保持し、CallList.onIncoming(Call, List<String>)
メソッドからonIncomingCall(Call)
イベントを発生させます。
それでは、InCallPresenterを見てみましょう:
/** *変更の* CallListから更新を受け取り、InCallActivity (UI)を通知します。 * 新しい通話のアクティビティを開始し、すべての通話が* である場合にアクティビティを終了する責任があります。 *通話中状態を作成および管理し、 の通話状態の変更をリスンしたいプレゼンター*のリスナーパターン を提供します。 * TODO:このクラスは、この時点で状態機械 の状態になっています。名前の変更を検討してください。 */
InCallPresenter
はCallList.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! ] */
私はこれがあなたの質問に答える、または非常に少なくとも願っていますが、どこを見れする方法を示します。私が見落とし/誤解したものは自由に修正してください。
誰が投票したかは良い答えですか? – StarPinkER
は、コードの下の希望はあなたを助けるこのGrep code InCallScreen.java
else if (action.equals(Intent.ACTION_ANSWER)) {
internalAnswerCall();
app.setRestoreMuteOnInCallResume(false);
return InCallInitStatus.SUCCESS;
ありがとうございます。それはAndroidのもっと古いバージョンです。 KitKatはどうですか? InCall Screenが変更されたようです –
を見てみましょう。
@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
どのシステムレベルですか?関連するものが巨大なものです:http://www.netmite.com/android/mydroid/development/pdk/docs/telephony.html – zapl
はい私はRILに精通しています。主にApplicationFrameworkのレイヤーに関係しています。それはJavaであり、簡単に変更できるからです。 –