Android 拨打电话流程
2015-08-18 14:49
447 查看
1、Contacts的AndroidManifest.xml中
MMIDialogActivity.java
oncreate() {
// register for MMI/USSD
mCM.registerForMmiComplete(mHandler, MMI_COMPLETE, null);
}
private class PhoneAppBroadcastReceiver extends BroadcastReceiver {
if (action.equals(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
int phoneId = SubscriptionManager.getPhoneId(subId);
String state = intent.getStringExtra(PhoneConstants.STATE_KEY);
Phone phone = SubscriptionManager.isValidPhoneId(phoneId) ?
PhoneFactory.getPhone(phoneId) : PhoneFactory.getDefaultPhone();
// The "data disconnected due to roaming" notification is shown
// if (a) you have the "data roaming" feature turned off, and
// (b) you just lost data connectivity because you're roaming.
boolean disconnectedDueToRoaming =
!phone.getDataRoamingEnabled()
&& PhoneConstants.DataState.DISCONNECTED.equals(state)
&& Phone.REASON_ROAMING_ON.equals(
intent.getStringExtra(PhoneConstants.STATE_CHANGE_REASON_KEY));
if (mDataDisconnectedDueToRoaming != disconnectedDueToRoaming) {
mDataDisconnectedDueToRoaming = disconnectedDueToRoaming;
mHandler.sendEmptyMessage(disconnectedDueToRoaming
? EVENT_DATA_ROAMING_DISCONNECTED : EVENT_DATA_ROAMING_OK);
}
}
case MMI_COMPLETE:
onMMIComplete((AsyncResult) msg.obj);
break;
private void onMMIComplete(AsyncResult r) { if (VDBG) Log.d(LOG_TAG, "onMMIComplete()..."); MmiCode mmiCode = (MmiCode) r.result; final Message message = Message.obtain(mHandler, MMI_CANCEL); PhoneUtils.displayMMIComplete(mmiCode.getPhone(), getInstance(),
mmiCode, message, null); }
2、packages/services/Telephony/src/com/android/phone/PhoneUtils.java
PeopleActivity的intent-filter的action设置为main,catelog设置为launcher,此activity是点击此应用第一个界面。dialtactsactivity包含四个tab,分别由TwelveKeyDialer、RecentCallsListActivity,两个activity-aliasDialtactsContactsEntryActivity和DialtactsFavoritesEntryActivity分别表示联系人和收藏tab,但是正真的联系人列表和收藏是由ContactsListActivity负责。
<!-- The main Contacts activity with the contact list, favorites, and groups. --> <activity android:name=".activities.PeopleActivity" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
protected void onCreate(Bundle savedState) { super.onCreate(savedState); createViewsAndFragments(savedState);//创建布局 } private void createViewsAndFragments(Bundle savedState) { // Disable the ActionBar so that we can use a Toolbar. This needs to be called before // setContentView(). getWindow().requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.people_activity);//布局文件 ... }
MMIDialogActivity.java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case PhoneGlobals.MMI_COMPLETE: Log.d(TAG, "handle MMI_COMPLETE"); onMMIComplete((AsyncResult) msg.obj); break; } } }; mPhone.registerForMmiComplete(mHandler, PhoneGlobals.MMI_COMPLETE, null); } /** * Handles an MMI_COMPLETE event, which is triggered by telephony */ private void onMMIComplete(AsyncResult r) { // Check the code to see if the request is ready to // finish, this includes any MMI state that is not // PENDING. MmiCode mmiCode = (MmiCode) r.result; String ussdHandler = null; if((r.userObj != null) && (r.userObj instanceof String)){ ussdHandler = (String)r.userObj; } // if phone is a CDMA phone display feature code completed message int phoneType = mPhone.getPhoneType(); if (phoneType == PhoneConstants.PHONE_TYPE_CDMA) { PhoneUtils.displayMMIComplete(mPhone, this, mmiCode, null, null);//-> } }
<pre name="code" class="java">PhoneGlobals.java
oncreate() {
// register for MMI/USSD
mCM.registerForMmiComplete(mHandler, MMI_COMPLETE, null);
}
private class PhoneAppBroadcastReceiver extends BroadcastReceiver {
if (action.equals(TelephonyIntents.ACTION_ANY_DATA_CONNECTION_STATE_CHANGED)) {
int subId = intent.getIntExtra(PhoneConstants.SUBSCRIPTION_KEY,
SubscriptionManager.INVALID_SUBSCRIPTION_ID);
int phoneId = SubscriptionManager.getPhoneId(subId);
String state = intent.getStringExtra(PhoneConstants.STATE_KEY);
Phone phone = SubscriptionManager.isValidPhoneId(phoneId) ?
PhoneFactory.getPhone(phoneId) : PhoneFactory.getDefaultPhone();
// The "data disconnected due to roaming" notification is shown
// if (a) you have the "data roaming" feature turned off, and
// (b) you just lost data connectivity because you're roaming.
boolean disconnectedDueToRoaming =
!phone.getDataRoamingEnabled()
&& PhoneConstants.DataState.DISCONNECTED.equals(state)
&& Phone.REASON_ROAMING_ON.equals(
intent.getStringExtra(PhoneConstants.STATE_CHANGE_REASON_KEY));
if (mDataDisconnectedDueToRoaming != disconnectedDueToRoaming) {
mDataDisconnectedDueToRoaming = disconnectedDueToRoaming;
mHandler.sendEmptyMessage(disconnectedDueToRoaming
? EVENT_DATA_ROAMING_DISCONNECTED : EVENT_DATA_ROAMING_OK);
}
}
case MMI_COMPLETE:
onMMIComplete((AsyncResult) msg.obj);
break;
private void onMMIComplete(AsyncResult r) { if (VDBG) Log.d(LOG_TAG, "onMMIComplete()..."); MmiCode mmiCode = (MmiCode) r.result; final Message message = Message.obtain(mHandler, MMI_CANCEL); PhoneUtils.displayMMIComplete(mmiCode.getPhone(), getInstance(),
mmiCode, message, null); }
2、packages/services/Telephony/src/com/android/phone/PhoneUtils.java
/** * Handle the MMIComplete message and fire off an intent to display * the message. * * @param context context to get strings. * @param mmiCode MMI result. * @param previousAlert a previous alert used in this activity. */ public static void displayMMIComplete(final Phone phone, Context context, final MmiCode mmiCode, Message dismissCallbackMessage, AlertDialog previousAlert) MmiCode.State state = mmiCode.getState(); switch (state) { case FAILED: text = mmiCode.getMessage(); }
相关文章推荐
- Android - 日期类的使用
- Android Service完全解析,关于服务你所需知道的一切(下)
- Android 不规则图像填充 小玩着色游戏
- Android Service完全解析,关于服务你所需知道的一切(上)
- NullPointerException: Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParam
- 删除android ScrollView边界阴影方法
- Android开发学习笔记:圆角的Button
- TabLayout android Tab的一种实现方式
- android adb 命令发送 keyevent
- 【译】Android LayerDrawable 和 Drawable.Callback
- 【Android应用开发技术:用户界面】9Patch图片设计
- Android笔记:获取屏幕信息
- 【Android应用开发技术:用户界面】界面设计中易混淆的概念汇总
- android实现Socket通信二
- Android ADB server didn't ACK * failed to start daemon * 简单有效的解决方案
- Android笔记:ListView
- android 通过eclipse混淆代码 打包 + proguard 总结
- 一个解决android多渠道打包的问题插件之(兰贝壳儿)
- Android四大组件之服务-Service 原理和应用开发详解
- 浅谈接口回调以及在Android中的使用