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类的实现
如下图所示
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类图结构如下
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连接来传输消息来实现的。
整个应用的代码可以概括如下图示意
5.关于C代码与硬件之间的交互
这部分工作其实就是C代码通过串口发送AT指令来拨号,收发短信。今天有点累了,具体的实现下次我再分析。
相关推荐
运用Android Studio实现打电话和发短信的功能,对应权限 Manifest.permission.CALL_PHONE和Manifest.permission.SEND_SMS
Android安卓源码-通讯录&联系人&打电话&发短信类源代码(4例),可供学习设计参考。
android打电话发短信
初学者安卓小程序,基于安卓6.0以上的安卓版本,完成打电话,发短信功能,并且涉及访问控制。
Android项目经常要实现的调用系统拨号盘打电话以及调用系统短信管理器发短信
主意:打电话和发短信要注册系统的权限在AndroidManifest.xml文件里面 列 打电话权限<uses-permission android:name="android.permission.CALL_PHONE"/> 用的的2.1的看自己版本修改参数即可
一个简单的使用Android Studio写的获取通讯录内容并且打电话发短信,如果安装完后APP闪退,请到设置中权限将相应的权限给他。
一个android的打电话,发短信的eclipse工程,导入即可使用
Android项目实战--手机卫士10--GPS定位与发送短信指令
Android例子源码可以定时批量发送短信的短信时光机是一个可以自定义定时批量短信发送例子源码(类似于短信时光机),编辑的短信可以一键选择多个联系人进行定时发送,批量发送祝福短信这种情况在节假日是普遍存在的...
该资源是一个完整的Android应用,演示了如何在Android中利用Intent进行拍照、摄像、打电话、发短信、发邮件等
Android最基本的发短信打电话 新人适用
Android实现打电话与短信服务,似乎是一个经常被谈及的基础问题,不过因其一些技巧性的东西,再此写了这个例子,其中的一些技巧愿为大家一起分享。另外本人水平问题,首先抛出一个疑问:Google API 中不建议使用...
Android RIL GSM底层驱动 实现打电话发短信功能详解
android实现打电话 发短信功能 本人习作 供学习参考 可以运行于android2.3之上的android系统
numpy源码 numpy-1.8.1.tar.gznumpy源码 numpy-1.8.1.tar.gznumpy源码 numpy-1.8.1.tar.gznumpy源码 numpy-1.8.1.tar.gznumpy源码 numpy-1.8.1.tar.gznumpy源码 numpy-1.8.1.tar.gznumpy源码 numpy-1.8.1.tar....
完整版的 android-support-v7-appcompat.jar;分低,请大家共享
3、通功能 用户在通录选择联系人进入联系详细信息界面,这时点击menu键打开通信功能框,选择打电话、发信息的功能进行操作。 4、菜单能 通过对menu按的点击,显示底部菜框,包含有增加查找、除、菜单、返回功能,...
Android实现发短信、打电话和位置查询的代码