android 4.3 铃声,Android4.22来电铃声流程

CallNotifier构造方法中调用registerForNotifications() 方法,触发PHONE_INCOMING_RING

private void registerForNotifications() {

mCM.registerForIncomingRing(this, PHONE_INCOMING_RING, null);  private CallManager mCM;

调用frameworks\opt\telephony\src\java\com\android\internal\telephony\CallManager

/**

* Notifies when an incoming call rings.

*

* Messages received from this:

* Message.obj will be an AsyncResult

* AsyncResult.userObj = obj

* AsyncResult.result = a Connection.

*/

public void registerForIncomingRing(Handler h, int what, Object obj){

mIncomingRingRegistrants.addUnique(h, what, obj);

}

PHONE_INCOMING_RING调用mRinger.ring()方法

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

case PHONE_NEW_RINGING_CONNECTION:

case PHONE_NEW_RINGING_CONNECTION2:

if (DBG) log("RINGING... (new)");

onNewRingingConnection((AsyncResult) msg.obj, msg.what);

mSilentRingerRequested = false;

break;

case PHONE_INCOMING_RING:

case PHONE_INCOMING_RING2:

if (DBG) log("PHONE_INCOMING_RING ! ");

// repeat the ring when requested by the RIL, and when the user has NOT

// specifically requested silence.

if (msg.obj != null && ((AsyncResult) msg.obj).result != null) {

PhoneBase pb = (PhoneBase)((AsyncResult)msg.obj).result;

boolean bSipRing = pb instanceof SipPhone;

boolean bIsRejected = false;

Call ringCall = pb.getRingingCall();

if (null != ringCall) {

bIsRejected = PhoneUtils.getShouldSendToVoiceMailFlag(ringCall.getLatestConnection());

}

if ((pb.getState() == PhoneConstants.State.RINGING)

&& (!mSilentRingerRequested)

&& (!bIsRejected)

&& ok2Ring) {

if (DBG) log("RINGING... (PHONE_INCOMING_RING event)");

boolean provisioned = Settings.Global.getInt(mApplication.getContentResolver(),

Settings.Global.DEVICE_PROVISIONED, 0) != 0;

//For sip call, the ringer will start in onCustomRingQueryComplete

if (provisioned && !bSipRing) {

mRinger.ring();

}

} else {

if (DBG) log("RING before NEW_RING, skipping");

}

}

break;

最终调用com.android.phone.Ringer ring()方法中的makelooper(); r.play();

private void makeLooper() {

if (mRingThread == null) {

mRingThread = new Worker("ringer");

if (mRingThread.getLooper() == null) {

return ;

}

mRingHandler = new Handler(mRingThread.getLooper()) {

@Override

public void handleMessage(Message msg) {

Ringtone r = null;

switch (msg.what) {

case PLAY_RING_ONCE:

if (DBG) log("mRingHandler: PLAY_RING_ONCE...");

if (mRingtone == null && !hasMessages(STOP_RING)) {

// create the ringtone with the uri

if (DBG) log("creating ringtone: " + mCustomRingtoneUri);

r = RingtoneManager.getRingtone(mContext, mCustomRingtoneUri);

synchronized (Ringer.this) {

if (!hasMessages(STOP_RING)) {

mRingtone = r;

}

}

}

r = mRingtone;

if (r != null && !hasMessages(STOP_RING) && !r.isPlaying()) {

if (DBG) {

log("play ringtone... ");

}

PhoneUtils.setAudioMode();

r.play();

synchronized (Ringer.this) {

if (mFirstRingStartTime < 0) {

mFirstRingStartTime = SystemClock.elapsedRealtime();

}

}

}

break;

case STOP_RING:

if (DBG) log("mRingHandler: STOP_RING...");

r = (Ringtone) msg.obj;

if (r != null) {

r.stop();

} else {

if (DBG) log("- STOP_RING with null ringtone! msg = " + msg);

}

getLooper().quit();

break;

}

}

};

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值