outgoingcall.docx

上传人:b****6 文档编号:3033837 上传时间:2022-11-17 格式:DOCX 页数:23 大小:30.13KB
下载 相关 举报
outgoingcall.docx_第1页
第1页 / 共23页
outgoingcall.docx_第2页
第2页 / 共23页
outgoingcall.docx_第3页
第3页 / 共23页
outgoingcall.docx_第4页
第4页 / 共23页
outgoingcall.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

outgoingcall.docx

《outgoingcall.docx》由会员分享,可在线阅读,更多相关《outgoingcall.docx(23页珍藏版)》请在冰豆网上搜索。

outgoingcall.docx

outgoingcall

/packages/apps/Contacts/src/com/android/contact/activities/DialtactsActivity.java

/packages/apps/Contacts/src/com/android/contact/dialpad/DialpadFragment.java

1.拨号界面

1).点击Phone图标。

进入Contacts包中,DialtactsActivity.java,为Activity对象

2).在DialtactsActivity.java类的onCreate()方法中调用了一个fixIntent(intent)方法,这个方法是用来响应点击事件的。

代码如下:

privaevoidfixIntent(Intentintent){

if(Intent.ACTION_CALL_BUTTON.equals(intent.getAction())){

intent.setDataAndType(Calls.CONTENT_URI,Calls.CONTENT_TYPE);

intent.putExtra("call_key",true);

setIntent(intent);

}

}

3).在DialtactsActivity.java类中有分别实例化了DialpadFragment.java、CallLogFragment.java、PhoneFavotiteFragment这三个Tab。

拨号盘对应的文件是DialpadFragment.java,也即我们将看到的数字输入框、拨号键等都是在DialpadFragment.java文件中定义的。

4).输入数字时,对应的监听事件是setupKeypad()方法和onClick()方法。

5).点击拨号键时,首先调用了onClick()方法,在它里面接着调用了dialButtonPressed()方法。

dialButtonPressed()根据我们的事件,判断是要拨打电话,所以它会接着调用newDialNumberIntent(number)方法,得到一个返回的Intent,添加一些附加数据intent.putExtra(DialtactsActivity.EXTRA_CALL_ORIGIN,DialtactsActivity.CALL_ORIGIN_DIALTACTS),最后通过这个Intent跳转到另一个Activity。

6)代码:

privateIntentnewDialNumberIntent(Stringnumber){

finalIntentintent=newIntent(Intent.ACTION_CALL_PRIVILEGED,

Uri.fromParts(“tel”,number,null));

intent.setFlags(Intent.FALG_ACTIVITY_NEW_TASK);

returnintent;

}

7)由6)中代码可知,参数为Intent.ACTION_CALL_PRIVILEGED。

查找文件Intent.java中参数声明,可知ACTION_CALL_PRIVILEGED=android.intent.action.CALL_PRIVILEGED,在通过查找Phone下面的AndroidManifest.xml,知道OutgoingCallBroadcaster设置的一项intent-filter的actionname为android.intent.action.CALL_PRIVILEGED,故可知下一个跳转的界面为OutgoingCallBroadcaster。

8).当前ActivityDialtactsActivity进入onPause()

/packages/apps/Phone/src/com/android/phone/OutgoingCallBroadcaster.java

/packages/apps/Phone/src/com/android/phone/MsimDialerActivity.java

/packages/apps/Phone/src/com/android/phone/CallController.java

/packages/apps/Phone/src/com/android/phone/PhoneApp.java

2.界面跳转

1).OutgoingCallBroadcaster.java,为Activity对象。

2).使用onCreate()创建了一个Activity,该Activity是介于拨号界面和通话界面之间的一个界面

3).在onCreate()方法中得到一个Intent,代码“Intentintent=getIntent();”。

4).下列

(1)和

(2)中的只执行一个

(1).当当前手机只用一个SIM卡可用时或尽管有多个SIM卡但没有时间选择哪个卡时,将会直接调用processIntent(intent)方法。

(2).当前手机有多个SIM卡可用,且满足其他所有条件时,我们要选择到底是使用SIM1还是SIM2,其代码如下:

IntentintentMSim=newIntent(this,MsimDialerActivity.class);

intentMSim.setData(intent.getData());

intentMSim.setAction(intent.getAction());

intsubscription=intent.getIntExtra(MsimConstants.SUBSCRIPTION_KEY,-1);

if(subscription!

=-1){

intentMSim.putExtra(MsimConstants.SUBSCRIPTION_KEY,subscription);

}

intrequestCode=1;

startActivityForResult(intentMSim,requestCode);

①此时我们进入到MsimDialerActivity.java中,在这个类中我们会将选择的SIM卡的信息添加到mIntent,并返回到OutgoingCallBroadcaster.java界面。

代码包括:

mIntent.putExtra(SUBSCRIPTION_KEY,subscription);

mIntent.setClass(MsimDialerActivity.this,OutgoingCallBroadcaster.class);

setResult(RESULT_OK,mIntent);/setResult(RESULT_CANCELED,mIntent);

②此时刚从MsimDialerActivity.java中返回,接下来我们会调用

protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){

//collectsubscriptiondatafromteintentanduseit

if(resultCode==RESULT_CANCELED){

finish();

}elseif(resultCode==RESULT_OK){

Bundleextras=data.getExtras();

mSubscription=extras.getInt(SUBSCRIPTION_KEY);

processIntent(data);

}

}

到此为止,我们将会调用processIntent(intent)方法。

5).进入processIntent(intent)方法中。

首先我们会将前面选择的SIM的信息添加到DialpadFragment.java发出的Intent中。

调用PhoneApp.getInstance().wakeUpScreen()方法(对通话在后台做进程管理),保证屏幕已经亮起。

6).从传递的Intent中得到我们要呼叫的电话号码,并且判断这个号码是否是紧急号码。

如果是紧急号码则执行代码“PhoneApp.getInstance().callController.placeCall(intent);”,来

展示一个incallUI,并进行具体的呼叫(具体参见CallController.java和PhoneApp.java)。

接着继续执行下面的步骤。

7).最后发送一个包含Intent的广播,代码:

IntentbroadcastIntent=newIntent(Intent.ACTION_NEW_OUTGOING_CALL);

if(number!

=null){

broadcastIntent.putExtra(Intent.EXTRA_PHONE_NUMBER,number);

}

PhoneUtils.checkAndCopyPhoneProviderExtras(intent,broadcastIntent);

staticvoidcheckAndCopyPhoneProviderExtras(Intentsrc,Intentdst){

dst.putExtra(InCallScreen.EXTRA_GATEWAY_PROVIDER_PACKAGE,

src.getStringExtra(InCallScreen.EXTRA_GATEWAY_PROVIDER_PACKAGE));

dst.putExtra(InCallScreen.EXTRA_GATEWAY_URI,

src.getStringExtra(InCallScreen.EXTRA_GATEWAY_URI));

}

broadcastIntent.putExtra(EXTRA_ALREADY_CALLED,callNow);

broadcastIntent.putExtra(EXTRA_ORIGINAL_URI,uri.toString());

broadcastIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);

sendOrderedBroadcast(broadcastIntent,PERMISSION,newOutgoingCallReceiver(),

null,//scheduler

Activity.RESULT_OK,//initialCode

number,//initialData:

initialvaluefortheresultdata

null);//initialExtras

8).由7)中代码“IntentbroadcastIntent=newIntent(Intent.ACTION_NEW_OUTGOING_CALL)

”可知参数Intent.ACTION_NEW_OUTGOING_CALL。

查找文件Intent.java中参数声明,可知ACTION_NEW_OUTGOING_CALL=android.intent.action.NEW_OUTGOING_CALL,再通过Phone下面的AndroidManifest.xml,知道OutgoingCallReceiver设置的一项intent-filter的actionname为android.intent.action.NEW_OUTGOING_CALL,故可知

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 人力资源管理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1