`
wuhua
  • 浏览: 2114208 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Android 源码分析-打电话和发短信

阅读更多
1. ITelephony接口和ISms接口以及AIDL 在我们的 Android 应用中,当需要实现电话拨号时,我们需要进行如下调用 ITelephony phone = (ITelephony)ITelephony.Stub.asInterface(ServiceManager.getService(phon)) phone.dial(10086); 对于 短信 应用,我们需要
  1. ITelephony接口和ISms接口以及AIDL
   在我们的Android 应用中,当需要实现电话拨号时,我们需要进行如下调用
   ITelephony phone = (ITelephony)ITelephony.Stub.asInterface(ServiceManager.getService("phon"))
   phone.dial("10086");
   对于短信 应用,我们需要的是调用SmsManager,代码如下
   SmsManager manager = SmsManager.getDefault();
   manager.sendTextMessage("10086",null,"hi,this is sms",null,null);
   这里,SmsManager对ISms做了一层包装,实质上是通过调用
   ISms simISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));
   simISms.sendRawPdu....
   
   可以看到,应用都是采用AIDL来实现IPC的跨进程调度。
   对于AIDL应用,调用进程方存在的是一个实现接口的Pro xy对象,通过Proxy对象与被调用进程中的Stub对象进行
通讯来实现IPC的跨进程调度,所以,在被调用进程一端必定有一个ITelephony.Stub类以及ISms.Stub类的实现
如下图所示
phone.png
下载 (9.14 KB)
昨天 20:36

2. PhoneInterfaceManager和SimSmsInterfaceManager
   ITelephony.Stub 的实现类为com.android.phone.PhoneInterfaceManager
   ISms.Stub的实现类为com.android.internal.telephony.gsm.SimSmsInterfaceManager
   从这两个类的构造器的调用代码里可以很清楚的看到进行了Service的注册工作
   ServiceManager.addService("phone",this);
   ServiceManager.addService("isms",this);
3. PhoneApp,InCallScreen,PhoneUtils及其他相关类
   从SimSmsInteferManager的相关方法实现中可以看到,具体就是调用GSMPhone的SmsDispatcher实例来进行相关操作的。
   从PhoneInterfaceManager会维持一个Phone对象的引用,当拨号应用时,PhoneInterfaceManager会将构造好的Intent传递
给PhoneApp应用,该Intent的className指定则为InCallScreen,从中我们可以看到InCallScreen具体是通过PhoneUtils调用Phone的
相关方法来实现。
   PhoneInterfaceManager怎么获取到对应的Phone对象,然后又怎么将Phone对象传递到InCallScreen中呢?
   具体这里涉及到了PhoneApp这个类,从这个类维护了一个 PhoneInterfaceManager的引用(phoneMgr)以及一个Phone引用(phone),
从该类的onCreate方法中我们可以清楚的看到,PhoneApp通过PhoneFactory获取了一个Phone实例,并通过该实例实现了PhoneInterfaceManager对象。
因此,我们现在只需要关注PhoneFactory具体提供的是一个什么样的Phone实例了。
   另外,PhoneApp类还提供了一个静态方法getInstance供InCallScreen调用,InCallScreen正是通过调用该方法获得PhoneApp实例从而
获得对应的Phone实例的。
   接下来,我们通过查看PhoneFactory的方法可以看到,Phone对象对应的就是一个GSMPhone实例。对应的UML类图结构如下
uml.png
下载 (26.62 KB)
昨天 20:36

4。GSMPhone与RIL
   从GSM的构造器可以看出,他依赖一个CommandInterface接口实例,通过PhoneFactory的makeDefaultPhones方法,我们可以看到,根据系统 环境变量
ro.radio.noril来判断是否需要采用RIL框架实现,如果该参数不为空,则采用Simultedcommands(主要是为了测试需要提供的模拟实现).否则,采用RIL。
   通过Google 才知道,RIL其实是智能手机 上实现AP与BP之间通信的一种设计思想,具体大家可以参见这篇文章http://www.eetchina.com/ARTICLES/2006OCT/PDF/CPCOL_2006OCT26_EMB_TA_170.PDF?SOURCES=DOWNLOAD
   在RIL.java 中我们很惊喜的看到,RIL对对消息的处理是将消息通过LocalSocket发送到以rild为名称的有名端口。这个有名Socket的创建在ril.cpp代码中。
   s_fdListen = android_get_control_socket(SOCKET _NAME_RIL)
   原来Android通话和发短信的应用是JAVA与C++代码之间透过Socket连接来传输消息来实现的。
整个应用的代码可以概括如下图示意
android.jpg
下载 (45.62 KB)
昨天 20:36

5.关于C代码与硬件之间的交互
   这部分工作其实就是C代码通过串口发送AT指令来拨号,收发短信。今天有点累了,具体的实现下次我再分析。
分享到:
评论
2 楼 lyxh_2003 2010-08-24  
强烈BS,转载也不把图拷贝一下。
1 楼 女巫の微笑 2010-07-14  
跟没讲一样

相关推荐

    运用Android Studio实现打电话和发短信

    总的来说,要在Android Studio项目中实现打电话和发短信的功能,你需要在`AndroidManifest.xml`中声明权限,根据需要在运行时请求权限,并正确构建和使用`Intent`。这个过程涉及到对Android系统API的理解以及对权限...

    安卓小程序(打电话,发短信)

    在安卓平台上,开发一款能够实现打电话和发送短信的小程序是一项基础但重要的技能。这个小程序针对的是安卓6.0及以上版本的系统,意味着它需要遵循安卓 Marshmallow (API 级别23) 及以上版本的开发规范。下面将详细...

    Android安卓源码-通讯录&联系人&打电话&发短信类源代码(4例)

    Android安卓源码-通讯录&联系人&打电话&发短信类源代码(4例),可供学习设计参考。

    Android实现打电话和发短信

    在Android应用开发中,有时需要集成打电话和发送短信的功能,以提供更丰富的用户体验。下面将详细解释如何在Android中实现这两个功能。 ### 调用系统拨号盘打电话 #### 跳转到拨号盘 ```java Intent intent = new ...

    android打电话发短信

    以上就是关于“Android打电话发短信”的基础知识。通过理解并熟练运用这些技术,你可以为用户提供方便快捷的通信功能。在`PhoneDemo`这样的项目中,你可能还会发现更多关于如何整合这些功能的实际示例代码和详细设计...

    张力android打电话和发短息软件源码共享+注释

    主意:打电话和发短信要注册系统的权限在AndroidManifest.xml文件里面 列 打电话权限<uses-permission android:name="android.permission.CALL_PHONE"/> 用的的2.1的看自己版本修改参数即可

    Android高级应用源码-android模拟短信插入和接收.zip

    在Android平台上,开发一款能够模拟短信插入和接收的应用是一项高级技术任务,这涉及到对Android系统的深入理解和对...通过这个源码学习,可以深入理解Android系统的短信服务,并为开发更复杂的通讯应用打下坚实基础。

    Android通讯录姓名手机号获取,打电话发短信功能。

    在Android平台上,获取用户的联系人信息以及实现打电话和发送短信的功能是常见的应用场景,尤其是在开发社交或者通讯类应用时。下面将详细讲解如何在Android Studio中实现这些功能。 首先,我们需要了解Android的...

    Android参考源码-一个短信应用源码.zip

    【Android参考源码-一个短信应用源码.zip】是一个针对Android平台的开源短信应用的源代码包,提供了深入理解Android消息传递系统、UI设计以及数据管理等核心功能的机会。源码学习是提升Android开发技能的重要途径,...

    android打电话发短信的eclipse工程

    这个"android打电话发短信的eclipse工程"为你提供了一个现成的框架,让你能够快速地实现这些功能。以下将详细解析这个工程中的关键知识点: 1. **Android权限管理**: 在Android中,无论是拨打电话还是发送短信,...

    Android项目实战--手机卫士10--GPS定位与发送短信指令

    Android项目实战--手机卫士10--GPS定位与发送短信指令

    Android高级应用源码-广播监听短信并获取短信内容.zip

    这个"Android高级应用源码-广播监听短信并获取短信内容.zip"的项目,显然涉及到如何通过自定义的BroadcastReceiver来监听并处理短信相关的事件。以下是关于这个主题的详细知识点: 1. **BroadcastReceiver基础**: ...

    Android例子源码可以定时批量发送短信的短信时光机.rar

    Android例子源码可以定时批量发送短信的短信时光机是一个可以自定义定时批量短信发送例子源码(类似于短信时光机),编辑的短信可以一键选择多个联系人进行定时发送,批量发送祝福短信这种情况在节假日是普遍存在的...

    Android打电话和发短信的小demo

    总的来说,这个“Android打电话和发短信的小demo”覆盖了Android开发中的多个重要知识点:运行时权限管理、Intent的使用、SmsManager的短信发送、联系人数据的读取以及UI交互。对于初学者来说,这是一个很好的实践...

    Android实现打电话与短信服务.rar

    Android实现打电话与短信服务,似乎是一个经常被谈及的基础问题,不过因其一些技巧性的东西,再此写了这个例子,其中的一些技巧愿为大家一起分享。另外本人水平问题,首先抛出一个疑问:Google API 中不建议使用...

    Android利用Intent拍照、摄像、打电话、发短信、发邮件等示例

    本资源“Android利用Intent拍照、摄像、打电话、发短信、发邮件等示例”提供了一个完整的应用实例,展示了如何灵活运用Intent来实现这些功能。下面将详细解释每个功能的实现方式。 1. **拍照** 使用Intent来调用...

    asmack-android-19-source-0.8.10

    在"asmack-android-19-source-0.8.10"这个压缩包中,包含了ASMACK针对Android 19(即KitKat版本)的源代码,版本号为0.8.10。这个版本的源码提供了对Android系统特性的优化,以适应其运行环境,并且在性能和稳定性上...

    ListView嵌套Viewpager实现左滑打电话,右滑发短信

    此外,为了实现打电话和发短信的功能,我们需要使用Android提供的Intent机制。对于拨打电话,我们可以创建一个隐式Intent,设置ACTION_CALL action,并附上电话号码作为数据。对于发送短信,我们需要创建一个显式...

Global site tag (gtag.js) - Google Analytics