能力值:
( LV2,RANK:10 )
|
-
-
2 楼
若我记得没错的话,发送短信用的是startAcvitity(intent),intent里面包含了短信信息,那肯定是走到activityManagerService上了。
用C可以模拟与activityManagerService的通信,达到发送短信的目的;我本人没试过,但是理论上可行。
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
查了一些资料 也说java发短息是通过socket与底层通讯实现的,可是现在还没有找到,能不能说的更清楚些
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
走服务呀 android很多功能都是远程调用的 发送短信走的是activityManager服务的startAcvitity接口,用本地层语言模拟这个过程。
至于Socket,我觉得你说的是PhoneService与RIL通信这块;我个人觉得没必要这么做。
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
Binder调用,指定AIDL中的命令码,按照AIDL生成的接口类的打包规则依次发送数据即可
发送短信示例:
adb shell
# service call isms 6 s16 10086 s16 +8613800755500 s16 0000 i32 0 i32 0
service可去查看Android代码 frameworks\native\cmds\service\service.cpp,本质上很简单就是封装了binder调用。
ISms中sendText接口的proxy端实现(Android4.2为例),除了InterfaceTokey service命令会自动加入外,其他参数依次传递,短信目的地址,短信中心,发送的内容,两个pendingintent我们不用都传0即可:
public void sendText(String destAddr, String scAddr, String text, android.app.PendingIntent sentIntent, android.app.PendingIntent deliveryIntent)
throws android.os.RemoteException
{
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
try {
_data.writeInterfaceToken("com.android.internal.telephony.ISms");
_data.writeString(destAddr);
_data.writeString(scAddr);
_data.writeString(text);
if (sentIntent != null) {
_data.writeInt(1);
sentIntent.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
if (deliveryIntent != null) {
_data.writeInt(1);
deliveryIntent.writeToParcel(_data, 0);
}
else {
_data.writeInt(0);
}
this.mRemote.transact(6, _data, _reply, 0);
_reply.readException();
}
finally {
_reply.recycle();
_data.recycle();
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
太赞了 原来不调用函数 直接可以这样搞
|
|
|