`

Android的电话功能介绍

 
阅读更多
第一部分 电话功能概述
     Android的Radio Interface Layer (RIL)提供了电话服务和的radio硬件之间的抽象层。
     Radio Interface Layer RIL(Radio Interface Layer)负责数据的可靠传输、AT命令的发送以及response的解析。应用处理器通过AT命令集与带GPRS功能的无线通讯模块通信。
     AT command由Hayes公司发明,是一个调制解调器制造商采用的一个调制解调器命令语言,每条命令以字母"AT"开头。

JAVA Framework
代码的路径为:
     frameworks/base/telephony/java/android/telephony
     android.telephony以及android.telephony.gsm

Core native:
在hardware/ril目录中,提供了对RIL支持的本地代码,包括4个文件夹:
hardware/ril/include 
hardware/ril/libril 
hardware/ril/reference-ril 
hardware/ril/rild

kernel Driver
     在Linux内核的驱动中,提供了相关的驱动程序的支持,可以建立在UART或者SDIO,USB等高速的串行总线上。



第二部分 电话功能各个部分
    hardware/ril/include/telephony/目录中的ril.h文件是ril部分的基础头文件。
    其中定义的结构体RIL_RadioFunctions如下所示:
typedef struct {
    int version;
    RIL_RequestFunc onRequest;
    RIL_RadioStateRequest onStateRequest;
    RIL_Supports supports;
    RIL_Cancel onCancel;
    RIL_GetVersion getVersion;
} RIL_RadioFunctions;
    RIL_RadioFunctions中包含了几个函数指针的结构体,这实际上是一个移植层的接口,下层的库实现后,由rild守护进程得到这些函数指针,执行对应的函数。
几个函数指针的原型为:
typedef void (*RIL_RequestFunc) (int request, void *data,
                                    size_t datalen, RIL_Token t);
typedef RIL_RadioState (*RIL_RadioStateRequest)();
typedef int (*RIL_Supports)(int requestCode);
typedef void (*RIL_Cancel)(RIL_Token t);
typedef const char * (*RIL_GetVersion) (void);
    其中最为重要的函数是onRequest(),它是一个请求执行的函数。

ril.png



2.1 rild守护进程
    rild 守护进程的文件包含在hardware/ril/rild目录中,其中包含了rild.c和radiooptions.c两个文件,这个目录中的文件经过编译后生成一个可执行程序,这个程序在系统的安装路径在:
/system/bin/rild
     rild.c是这个守护进程的入口,它具有一个主函数的入口main,执行的过程是将请求转换成AT命令的字符串,给下层的硬件执行。在运行过程 中,使用dlopen 打开路径为/system/lib/中名称为libreference-ril.so的动态库,然后从中取出 RIL_Init符号来运行。
     RIL_Init符号是一个函数指针,执行这个函数后,返回的是一个RIL_RadioFunctions类型的指针。得到这个指针后,调用RIL_register()函数,将这个指针注册到libril库之中,然后进入循环。
     事实上,这个守护进程提供了一个申请处理的框架,而具体的功能都是在libril.so和libreference-ril.so中完成的。

2.2 libreference-ril.so动态库

libreference-ril.so动态库的路径是:
hardware/ril/reference-ril
其中主要的文件是reference-ril.c和atchannel.c。这个库必须实现的是一个名称为RIL_Init的函数,这个函数执行的结果是返回一个RIL_RadioFunctions结构体的指针,指针指向函数指针。
这个库在执行的过程中需要创建一个线程来执行实际的功能。在执行的过程中,这个库将打开一个/dev/ttySXXX的终端(终端的名字是从上层传入的),然后利用这个终端控制硬件执行。

2.3 libril.so动态库
     libril.so库的目录是:
hardware/ril/libril 
     其中主要的文件为ril.cpp,这个库主要需要实现的以下几个接口为:
RIL_startEventLoop(void);
void RIL_setcallbacks (const RIL_RadioFunctions *callbacks);
RIL_register (const RIL_RadioFunctions *callbacks);
RIL_onRequestComplete(RIL_Token t, RIL_Errno e, void *response, size_t responselen);
void RIL_onUnsolicitedResponse(int unsolResponse, void *data,
                                size_t datalen);
RIL_requestTimedCallback (RIL_TimedCallback callback, void *param,
                                const struct timeval *relativeTime);
    这些函数也是被rild守护进程调用的,不同的vendor可以通过自己的方式实现这几个接口,这样可以保证RIL可以在不同系统的移植。其中 RIL_register()函数把外部的RIL_RadioFunctions结构体注册到这个库之中,在恰当的时候调用相应的函数。在执行的过程中, 这个库处理了一些将请求转换成字符串的功能。
分享到:
评论

相关推荐

    android10.0禁止拨打电话(屏蔽拨打电话功能).txt

    android 10.0禁止系统拨打电话功能,屏蔽掉系统拨打电话的功能

    android 实现拨打电话黑屏功能

    在Android平台上实现拨打电话并同时让屏幕保持黑屏或关屏的功能,对于一些特定的应用场景,比如紧急呼叫或者隐私保护,具有一定的实用价值。本文将详细介绍如何实现这一功能,并提供相应的源码分析。 首先,我们...

    Android 实现电话来去自动录音的功能

    总结起来,Android 实现电话自动录音功能需要监听电话状态变化,通过 `PhoneStateListener` 处理来电和去电状态,并结合 `BroadcastReceiver` 监听去电拨号。在适当的状态下,利用 `MediaRecorder` 进行录音操作。在...

    android 电话源码Phone.zip

    本文将聚焦于"android 电话源码Phone.zip",通过对压缩包内的Phone文件进行分析,探讨Android电话功能的实现细节。 首先,我们要明白Android电话功能主要由以下几部分组成:电话服务(PhoneService)、通话管理器...

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

    关于打电话功能,你可以使用Intent来启动系统的电话拨打界面或直接拨打电话: ```java // 启动拨号界面 Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); start...

    android webview 拨打电话

    首先,Android系统对拨打电话功能有严格的权限控制。在Android 6.0(API级别23)及以上版本,应用需要在运行时请求`Manifest.permission.CALL_PHONE`权限。因此,我们需要在AndroidManifest.xml中声明此权限,并在...

    android实现打电话功能

    //拔打电话号码 //"android.intent.action.CALL" Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ mobile)); startActivity(intent);//内部会添加android.intent.category.DEFAULT

    Android电话号码簿Sqlite

    "Android电话号码簿Sqlite" Android操作系统是一个基于Linux的开源码操作系统,主要用于便携设备。随着Android技术的出现,越来越多的手机开发商采用Android操作系统,因此Android通讯录的开发也变得必不可少。本...

    Android应用中增加电话拨打功能实例

    在Android应用开发中,有时我们需要实现一个功能,让用户可以直接通过我们的应用拨打指定的电话号码。这个功能对于诸如客服热线、预约服务或者紧急联络等场景非常有用。本实例将讲解如何在Android Studio环境下创建...

    android电话归属地本地数据库

    这个"android电话归属地本地数据库"就是专门为实现这一功能而设计的。这个数据库通常包含了全国乃至全球的电话号码段及其对应的归属地信息,以便在接收到电话时快速查找到对应的信息。 mobileNumber.db 是数据库...

    android实现简单的拨号功能

    在Android平台上,实现一个简单的拨号功能涉及到对系统电话API的使用,这主要涉及到`Intent`、`tel:`协议以及权限管理。以下是对这个话题的详细解析: 首先,Android应用程序不能直接操作硬件,而是通过发送意图...

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

    对于打电话功能,需要添加`Manifest.permission.CALL_PHONE`权限,这样应用才能调用系统的拨号器拨打电话。对于发送短信功能,需要`Manifest.permission.SEND_SMS`权限,使得应用能够创建并发送短信。在`...

    Android广播接实现监听电话状态(电话的状态,拦截)

    以下知识点将详细介绍如何实现这一功能。 首先,Android的事件处理机制包括监听(Listener)和回调(Callback)。基于监听的事件处理机制涉及三个核心对象:事件源(EventSource)、事件(Event)和事件监听器...

    安卓Android源码——android打电话源码.rar

    本资源“安卓Android源码——android打电话源码.rar”提供了一种深入理解如何在Android应用程序中实现打电话功能的方式。通过分析这个源码,我们可以学习到如何在Android系统中集成电话拨打功能,并了解相关API和...

    安卓Android源码——android打电话源码.zip

    在安卓(Android)系统中,打电话功能是移动设备的基本功能之一。这个压缩包“安卓Android源码——android打电话源码.zip”(实际为rar文件)很可能是包含了Android系统中实现拨打电话功能的相关源代码。通过分析...

    android 短信和电话拦截

    在Android中,为了保护用户的隐私,任何应用想要访问或操作短信和电话功能都需要获取相应的系统权限。对于短信拦截,应用需要在`AndroidManifest.xml`文件中声明`READ_SMS`和`WRITE_SMS`权限;而对于电话拦截,则...

    android4.0 电话Phone源代码

    Android 4.0(Ice Cream Sandwich,简称ICS)时期的Phone模块源代码为我们提供了一个深入了解Android电话系统内部运作的窗口。下面我们将深入探讨这个模块的主要组成部分、工作原理及其相关知识点。 1. **Phone服务...

    android实现拨打电话

    在Android平台上,实现拨打电话功能是一项常见的任务,尤其对于那些需要与用户进行语音通信的应用来说。这个过程涉及到Android系统的权限管理、Intent机制以及电话服务的交互。以下将详细讲解如何在Android应用中...

    Android应用源码之quitesleep手机电话功能软件.zip

    本文将深入探讨基于“quitesleep手机电话功能软件”的源码,以此为实例,详细解析Android电话功能的实现原理。 一、Android电话功能概述 在Android系统中,电话功能主要依赖于Telephony框架,它提供了通话、短信...

    基于Android实现电话本管理系统

    在Android平台上开发一个电话本管理系统是一项常见的任务,它涉及到用户界面设计、数据管理以及与操作系统交互等多个方面。本文将深入探讨如何实现这样一个系统,重点包括增删查改四大功能。 首先,我们需要创建...

Global site tag (gtag.js) - Google Analytics