- 浏览: 436046 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
weiwu83:
为什么我在手机内访问127.0.0.1访问不了呀
NanoHttpd 构建android 手机端的HttpServer -
jiae:
为啥我的插入语句乱码? 但是可以插入数据库 然后复制你 ...
SQLite3 在应用启动时初始化数据 -
lichenxiao77:
...
android 连接远程数据库 -
林源滔:
为什么我make clobber之后第一次执行make 可以。 ...
No rule to make target `out/target/common/obj/JAVA_LIBRARIES/bouncycastle_in -
cn23snyga:
new String(str.getBytes("I ...
android 平台上SQLite3中文乱码 --我的小bug
短信接收是从ril.cpp文件通过socket与RIL.java的socket交流,当ril.cpp收到短信后处理完成后会通过socket发送字节流给上层的RIL.java,而在RIL.java中有Receiver架构(该架构主要是一条线程)在不断监听,
Receiver架构代码:
class RILReceiver implements Runnable {
byte[] buffer;
RILReceiver() {
buffer = new byte[RIL_MAX_COMMAND_BYTES];
}
public void
run() {
int retryCount = 0;
try {
for (;;) {
LocalSocket s = null;
LocalSocketAddress l;
try {
s = new LocalSocket();
l = new LocalSocketAddress(SOCKET_NAME_RIL,
LocalSocketAddress.Namespace.RESERVED);
s.connect(l);
} catch (IOException ex) {
try {
if (s != null) {
s.close();
}
} catch (IOException ex2) {
// ignore failure to close after failure to connect
}
// don't print an error message after the the first time
// or after the 8th time
if (retryCount == 8) {
Log.e(LOG_TAG,
"Couldn't find '" + SOCKET_NAME_RIL
+ "' socket after " + retryCount
+ " times, continuing to retry silently");
} else if (retryCount > 0 && retryCount < 8) {
Log.i(LOG_TAG,
"Couldn't find '" + SOCKET_NAME_RIL
+ "' socket; retrying after timeout");
}
try {
Thread.sleep(SOCKET_OPEN_RETRY_MILLIS);
} catch (InterruptedException er) {
}
retryCount++;
continue;
}
retryCount = 0;
mSocket = s;
Log.i(LOG_TAG, "Connected to '" + SOCKET_NAME_RIL
+ "' socket");
int length = 0;
try {
InputStream is = mSocket.getInputStream();
for (;;) {
Parcel p;
length = readRilMessage(is, buffer);
if (length < 0) {
// End-of-stream reached
break;
}
p = Parcel.obtain();
p.unmarshall(buffer, 0, length);
p.setDataPosition(0);
// Log.v(LOG_TAG, "Read packet: " + length +
// " bytes");
processResponse(p);
p.recycle();
}
} catch (java.io.IOException ex) {
Log.i(LOG_TAG, "'" + SOCKET_NAME_RIL
+ "' socket closed",
ex);
} catch (Throwable tr) {
Log.e(LOG_TAG, "Uncaught exception read length="
+ length +
"Exception:" + tr.toString());
}
Log.i(LOG_TAG, "Disconnected from '" + SOCKET_NAME_RIL
+ "' socket");
setRadioState(RadioState.RADIO_UNAVAILABLE);
try {
mSocket.close();
} catch (IOException ex) {
}
mSocket = null;
RILRequest.resetSerial();
// Clear request list on close
synchronized (mRequestsList) {
for (int i = 0, sz = mRequestsList.size(); i < sz; i++) {
RILRequest rr = mRequestsList.get(i);
rr.onError(RADIO_NOT_AVAILABLE, null);
rr.release();
}
mRequestsList.clear();
}
}
} catch (Throwable tr) {
Log.e(LOG_TAG, "Uncaught exception", tr);
}
}
}
因此从代码可以看出获取到短信消息后经过一系列地分析然后提交给processResponse(p); 方法处理,处理过程中会有两种response,一种是主动上报,比如网络状态,短信,来电等都不需要经过请求,用unsolicited词语专门描述,另一种才是真正意义上的response,也就是命令的响应用solicited描述。那接收短信就是属于unsolicited,跳到processUnsolicited (Parcel p)方法,查看该方法可得出会继续触发以下方法mSMSRegistrant.notifyRegistrant(new AsyncResult(null, sms, null)); 追溯该方法对象的创建,最后发现该方法设置handler的源头是在:SMSDispatcher类里
该类做了一件重要的事:给Command Interface设置handler的处理方法,就是当接收到短信后触发mSMSRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));方法,然后回调调用之前传入的handler,接着在handler里面处理短信消息。
mCm.setOnNewSMS(this, EVENT_NEW_SMS, null);
mCm.setOnSmsStatus(this, EVENT_NEW_SMS_STATUS_REPORT, null);
mCm.setOnIccSmsFull(this, EVENT_ICC_FULL, null);
mCm.registerForOn(this, EVENT_RADIO_ON, null);
handler处理接收到的短信消息:
@Override
public void handleMessage(Message msg) {
AsyncResult ar;
switch (msg.what) {
case EVENT_NEW_SMS:
// A new SMS has been received by the device
if (Config.LOGD) {
Log.d(TAG, "New SMS Message Received");
}
SmsMessage sms;
ar = (AsyncResult) msg.obj;
if (ar.exception != null) {
Log.e(TAG, "Exception processing incoming SMS. Exception:"
+ ar.exception);
return;
}
sms = (SmsMessage) ar.result;
try {
int result = dispatchMessage(sms.mWrappedSmsMessage);
if (result != Activity.RESULT_OK) {
// RESULT_OK means that message was broadcast for app(s) to
// handle.
// Any other result, we should ack here.
boolean handled = (result == Intents.RESULT_SMS_HANDLED);
notifyAndAcknowledgeLastIncomingSms(handled, result, null);
}
} catch (RuntimeException ex) {
Log.e(TAG, "Exception dispatching message", ex);
notifyAndAcknowledgeLastIncomingSms(false,
Intents.RESULT_SMS_GENERIC_ERROR, null);
}
break;
}
}
int result = dispatchMessage(sms.mWrappedSmsMessage); 该段会通过子类(GsmSMSDispatcher)的dispatchMessage方法处理。经一系列的判断处理最后普通短信将交给dispatchPdus(pdus);这个方法处理。
protected void dispatchPdus(byte[][] pdus) {
Intent intent = new Intent(Intents.SMS_RECEIVED_ACTION);
intent.putExtra("pdus", pdus);
dispatch(intent, "android.permission.RECEIVE_SMS");
}
void dispatch(Intent intent, String permission) {
// Hold a wake lock for WAKE_LOCK_TIMEOUT seconds, enough to give any
// receivers time to take their own wake locks.
mWakeLock.acquire(WAKE_LOCK_TIMEOUT);
mContext.sendOrderedBroadcast(intent, permission, mResultReceiver,
this, Activity.RESULT_OK, null, null);
}
最后,我们可以看出这个方法将短信通过顺序广播播放出去(action是SMS_RECEIVED_ACTION),无论广播是否被中断最后都会调用mResultReceiver,这里会将已读或未读的状态告诉给对方。如果短信广播中间没有受到終止,那么接下来的流程是:PrivilegedSmsReceiver类接收到android.provider.Telephony.SMS_RECEIVED的请求然后调用 intent.setClass(context, SmsReceiverService.class); 启动SmsReceiverService服务类来处理短信并保存短信。
发表评论
-
Android.mk文件解析
2016-01-27 14:01 937以 tools/tradefederation/Androi ... -
NanoHttpd 构建android 手机端的HttpServer
2015-10-20 16:24 2947NanoHttpd是Github上的一个开源项目, 通过下载 ... -
permission denial : android.permission.INTERACT_ACROSS_USERS_FULL
2015-08-05 16:50 5046在android5.0上运行 Runtime.getRun ... -
android getprop() 和 java System.getPropety()
2015-06-04 14:39 63581 System.getPropety()是java中的方 ... -
android cts测试相关
2015-05-27 17:38 0example: -
android uiautomator 相关
2015-05-15 16:53 16951 Runtime.getRuntime().exec 启 ... -
android UI test Espresso
2015-04-10 18:31 1202google android UI测试工具 espresso ... -
android 安全(转)
2014-12-26 12:37 721一 如何不被反编译解析1防止反编译工具的反编译 查看 ... -
nexus related
2014-12-17 15:29 7411 nexus drivers https://deve ... -
git related
2014-12-17 15:24 9671 see all detailed git info ... -
ubuntu android studio 配置和使用
2014-12-10 17:34 3627Ubuntu 64位,Android studio 的安装, ... -
eclipse+ADT+android配置相关
2014-12-05 16:40 14531 eclipse 过旧时,ant 运行不了,会报sdk. ... -
anroid 开发小知识点
2014-10-09 09:52 8231 1)代码 获取APK安装路径和包名 L ... -
androird 内存泄露 浅析
2013-06-19 17:52 1449主要是记录工作中出 ... -
mms 相关链接
2013-03-15 13:53 1395http://blog.chinaunix.net/uid ... -
java层堆栈调用的打印
2012-12-26 15:14 44711. 在指定的函数内打印相关java调用 Log.d ... -
mms 数据包相关
2012-11-26 14:51 22721 抓包 adb shell tcpdump -i any ... -
sms AT指令返回错误代码: CMS errors & CME errors 的区别!
2012-10-26 18:35 12027CMS的是短信中心的返回错误。 CME 是设备返 ... -
sms 发送 radio log
2012-10-26 17:25 4073发送短信:radio.log 关键字 :SEND_SMS ... -
SQLite --函数
2012-09-03 18:22 1987一、日期和时间函数:原文地址SQLite主要支持以下 ...
相关推荐
2. **短信服务**:RIL负责短信的发送和接收,包括SMS-PDU和SMS-TP协议的处理。短信的编码、解码以及发送至正确目的地都是RIL的工作范畴。 3. **数据连接管理**:RIL控制数据连接的建立、断开,包括2G、3G、4G、5G等...
本篇文章将详细解析Android 4.4版本中RIL如何处理短信接收的流程。 1. **RIL接收到短信的初步处理**: 当手机接收到短信时,RIL会通过无线电控制器(Radio Controller,ATC)接收到AT命令`+CMT:`,这表明有新的...
- **ril_sms.c/h**:负责短信服务,包括发送、接收和存储短信。 - **ril_network.c/h**:网络连接和数据业务的处理。 四、调试与开发 对于开发者而言,理解并使用reference-ril库进行RIL开发至关重要。开发者可以...
3. **短信处理**:提供短信的发送和接收功能,支持SMS协议,满足用户的基本通信需求。 4. **网络注册**:自动检测和注册到可用的网络,确保设备始终保持连接状态。 5. **位置服务**:通过GPS和其他定位技术,提供...
5. **短消息服务(SMS)**:RIL处理短信的发送和接收,包括PDU模式和Text模式的短信。 6. **位置信息**:RIL还可以获取手机的位置信息,例如通过GPS、蜂窝塔三角定位等方式。 7. **网络状态监控**:RIL持续监控...
这包括检查 RIL daemon 如何解析接收到的 SMS 数据包,验证其是否能正确处理异常情况,以及确保在处理过程中有适当的错误检测和边界条件检查。 为了提高 Android 设备的安全性,安全测试是必不可少的步骤。这不仅...
Android RIL,全称为Radio Interface Layer,是Android操作系统中至关重要的一个组件,它充当着操作系统与无线通信硬件之间的桥梁。RIL负责处理所有与移动网络相关的底层通信,包括蜂窝数据、电话呼叫、短信服务以及...
### Android RIL详解 ...通过对RIL各组件的理解及其初始化流程的深入分析,我们可以更好地理解Android中无线通信的基本原理和技术细节。这种深入的技术洞察对于优化移动设备上的网络通信性能至关重要。
4. `reference-cdma-sms`和`reference-ril`子目录包含CDMA短信和通用RIL参考实现,`reference-ril.c`主要负责与Modem的交互,使用`atchannel.h/cpp`等文件提供的AT命令通道来读写Modem数据。 理解Android RIL的工作...
在Android系统中,RIL扮演着处理底层通信任务的角色,如初始化网络连接、拨打电话、发送短信等。本文将深入探讨RIL驱动接口及其在移动开发中的作用。 首先,`ril.h`文件是RIL驱动接口的头文件,它包含了所有RIL相关...
#### SMS接收流程 1. **接收事件**:短信接收流程从`RIL.java`开始,其中定义了多个事件,例如`RIL_UNSOL_RESPONSE_NEW_SMS`用于GSM短信接收,`RIL_UNSOL_RESPONSE_CDMA_NEW_SMS`用于CDMA短信接收。 2. **解码处理...
在Android系统中,电话流程是一个复杂且重要的过程,它涉及到多个系统组件的交互。这篇文档主要针对Android初学者,旨在详细解析电话流程的工作原理。在Android平台上,电话管理由电信框架(Telephony Framework)...
本文将深入探讨Android短信收发的流程,包括发送、接收、处理以及相关的API使用。 一、短信发送流程 1. 用户在短信应用中输入收件人和消息内容。 2. 应用调用`SmsManager`类提供的方法,例如`sendTextMessage()`,...
Android Telephony 概述分析 Android Telephony 是一个核心组件,负责处理移动设备的电话、短信和SIM卡功能。在Android系统中,它构建了一个复杂的架构,与硬件接口(RIL,Radio Interface Layer)紧密协作,确保...
本文将深入探讨Android Telephony框架的结构、工作原理以及相关的源码分析。 1. **TelephonyManager服务** Android系统的TelephonyManager服务是应用程序与电话功能交互的主要接口。它提供了多种方法,如获取运营...
5. **短消息服务**(SMS):发送和接收短信。 描述中的“With this class you can read out the actual cell of your mobile and other infos”表明,这个`RIL.cs`文件可能提供了访问RIL接口的类,允许开发者获取...
1. **Android SDCard UnMounted 流程分析:** SD卡在Android设备中作为外部存储,用于扩展手机的存储空间。当SD卡被卸载时,可能是因为用户移除SD卡或系统进行维护操作。分析这一流程有助于理解如何正确处理SD卡的...
- 在`AndroidManifest.xml`中注册`BroadcastReceiver`,并添加`<receiver>`标签,设置`android.permission.RECEIVE_SMS`权限,以允许接收短信。 - 使用`IntentFilter`指定`ACTION_SMS_RECEIVED`,这样当有新短信...
根据给定的文件信息,我们将深入探讨Android电话部分的核心组件及其功能实现,特别是关于RIL层的详细解析。 ### 第一部分:Android电话部分的结构 Android的电话功能,即Telephony,是其作为智能移动设备平台的...