Android之通话和短信
通话和短信
通信和短信功能依托于底层硬件和驱动的支持,不同设备有不同标准的基带BaseBand硬件。在底层之上,Android抽象了通信接口层RIL,由通信守护服务和设备厂商的通信类库组成。设备启动时,守护服务会加载通信类库,并监听特定的端口启动通话相关的Socket服务。
?
??? 通信接口联通了上层类库和底层设备。用户需要拨号等通信请求时,上层类库会将请求转换成特定指令,通过Socket连接并发送至守护服务,通信守护服务调用通信类库,通过底层硬件将请求发送出去。
?
在Android的框架层,通话和短信功能定义在telephony包,负责建立于RIL服务的连接,并将用户的请求转换成指令和数据进行传输。不同的通话协议中的一些特殊的功能都由各自的Java包提供,如gsm提供获取GSM协议相关的参数。
在应用层,处理通话请求的通话应用Phone Application是Android中最为特殊的应用。和框架耦合密切,负责所有通话请求相关的处理。系统提供的通话应用不能被第三方取代,一次保证通话的可靠。
?
通话的处理
telephonyManager查看通话状态、SIM卡信息
telephonyManager.getPhoneType通话网络类型
telephonyManager.getCallState通话状态
使用telephonyManager.listen函数,注册telephonyManager.phoneStateListener适时监听通话状态的变更,适时查询来电显示。
?
出于安全考虑,没有将拨号呼叫、接听电话的接口暴露,应用中需要打电话,需要Intent实现。
StartActivity(new Intent(Intent.ACTION_DIAL, new URI.parse(“tel:XX”)))
或
StartActivity(new Intent(Intent.ACTION_CALL, new URI.parse(“tel:XX”)))
?
短信的发送和接受
SmsManager可以控制发送短信或彩信。
//构造回掉事件,短信发送结束后,会发出对应的Intent请求
Intent intent = new Intent(“com.sample.sms_sent”);
Intent.putExtra(“sms_id”, GenerateSmsId());
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
//发送文本短信
SmsManager smsManager = SmsManager .getDefault();
smsManager.sendTextMessage(phone_number, null, text_content,? pendingIntent,null);
?
PendingIntent是异步Intent对象,当短信发送完成后,会触发预设的广播事件,通过监听该广播事件,可获知短信发送结果。