一种基于Android系统的实现双卡发送短信方法与流程

文档序号:14396410阅读:373来源:国知局

本发明涉及移动通信技术领域,具体涉及一种基于android系统的实现双卡发送短信方法。



背景技术:

由于google官方的android原生系统不支持双卡,而且在开放sdk的api中发送短信的函数也是默认单卡发送。目前国内android系统的双卡双待手机虽然可以指定sim卡发送短信,但却没有开放相关的接口来实现该功能,因此亟待提出一种基于android系统的实现双卡发送短信方法。



技术实现要素:

本发明的目的是为了解决现有技术中的上述缺陷,提供一种基于android系统的实现双卡发送短信方法。

本发明的目的可以通过采取如下技术方案达到:

一种基于android系统的实现双卡发送短信方法,所述的实现双卡发送短信方法包括下列步骤:

s1、基于window操作系统,并安装好java的开发环境jdk、eclipse等;

s2、android移动终端进行root和并安装xposed框架;

s3、拥有一个android项目,新建或者导入现有项目;

s4、在网上下载xposedbridgeapi-42.jar的jar包;

s5、导入到android项目新建的lib目录中,并对其buildpath操作;

s6、编写hook“android.telephony.subscriptionmanager”类中“getsubid(int)”函数的实参数据的程序,并用文件保存在所hook得到的数据到对应的目录下;

s7、编写短信发送类;

s8、在发送类中利用反射技术来对“android.telephony.smsmanager”类的“msubid”字段用步骤s5获取到的数据来对该字段进行指定sim卡的赋值;

s9、利用反射技术对“sendtextmessage”函数进行传参即可实现短信的发送;

s10、对该实现进一步封装,以备直接进行调用。

进一步地,所述的步骤s6包括以下过程:

s601、新建类并实现xposedbridgeapi-42.jar中的ixposedhookloadpackage接口;

s602、在实现ixposedhookloadpackage接口的handleloadpackage(loadpackageparamlpparam)函数中判断系统加载的包名是否是“com.android.mms”,如不属于则中止执行,若属于则执行下一步骤;

s603、利用xposedhelpers.findandhookmethod函数来对android.telephony.subscriptionmanager类中的getsubid(int)函数进行监听;

s604、将监听到的param.args[0]和(int[])param.getresult())[0]分别保存到phoneid0.txt和phoneid1.txt文件中。

进一步地,所述的步骤s8包括以下过程:

s81、反射“android.telephony.smsmanager”类的“msubid”字段,具体过程如下:

s811、当android版本为5.0或以后的版本时,对android.telephony.smsmanager类的getdefault()函数进行反射获取该类的对象;

s812、获取android.telephony.smsmanager类中的msubid字段的访问权限;

s813、通过反射机制获取对该字段的修改权限;

s82、获取步骤s5保存文件的数据,具体过程如下:

s821、新建一个处理双卡的类,暂命名为dualsim;

s822、在dualsim类中声明两个int型字段用来记录卡槽的id值,分别为msub1和msub2;

s823、增加读取文件的函数,用来读取之前记录在本地phoneid0.txt和phoneid1.txt中的内容;

s824、并把两个文件中的内容分别赋值到msub1和msub2中。

进一步地,所述的步骤s9包括以下过程:

s91、编写发送短信接口icustomsms,并声明接口函数为sendtextmessage,并对其设置形参(

目标号码(dstaddress),

短信中心服务码(scaddress),

内容(text),

发送短信结果状态信号(sentintent),

对方接收状态信号(deliveryintent),

卡槽id值(cardid));

s92、实现短信接口的管理类,并对“sendtextmessage”方法进行抽象;

s93、重写“sendtextmessage”方法,并用发送短信接口进行调用发送。

进一步地,所述的步骤s92、实现短信接口的管理类,并对“sendtextmessage”方法进行抽象的具体过程如下:

s921、新建一个短信接口管理类(smsinterfacefactory)并实现上面的icustomsms接口;

s922、在smsinterfacefactory内部类中声明geticustomsms函数来根据系统版本的初始化反射android.telephony.smsmanager后获取类的实例化对象,并通过反射机制来设置允许访问私有参数的权限和允许访问msubid字段的权限。

进一步地,所述的步骤s922的具体过程如下:

s9221、声明引用对象smsmanager和cardidfield,其中smsmanager持有android.telephony.smsmanager类的对象,其中cardidfield持有android.telephony.smsmanager中msubid字段;

s9222、获取并设置相关的权限,该步骤具体如下:

首先,通过反射机制android.telephony.smsmanager类中的getdefault()函数来获取短信管理类的对象,并将该对象交给smsmanager进行持有;

然后,通过反色机制获取访问msubid字段的权限,并交由cardidfield来进行持有;

最后,通过反色机制来设置允许访问私有参数;

s9223、匹配获取当前系统具体的短信发送方案,该步骤具体如下:

首先,初始化短信接口工厂类(smsinterfacefactory)为factory;

其次,重写smsinterfacefactory类中的sendtextmessage(string,string,string,pendingintent,pendingintent,int)函数;

s9224、对外提供一个抽象的函数sendtextmessage(string,string,string,pendingintent,pendingintent,int)让子类去实现或重写改函数.这样可通过该函数来实现。

进一步地,所述的步骤s9223中重写smsinterfacefactory类中的sendtextmessage(string,string,string,pendingintent,pendingintent,int)函数具体如下:

设置发送短信移动终端卡槽的id;

反射sendtextmessage函数中的参数,并进行调用;

通过反射机制获取系统中的sendtextmessage(string,string,string,pendingintent,pendingintent)函数;

设置可通过反射来调用该函数。

进一步地,所述的步骤s93、重写“sendtextmessage”方法,并用发送短信接口进行调用发送具体如下:

新建管理类hrstsmsmanager,首先,内部持有icustomsms接口的引用对象;然后,声明外部可调用函数sendsms(string,string,int),内部已通过smsinterfacefactory.geticustomsms()初始化icustomsms的引用对象,并通过该引用对象来调用sendtextmessage(string,string,string,pendingintent,pendingintent,int)。

进一步地,所述的步骤s10具体过程如下:

s1001、新建短信工厂管理类hrstsmsmanagerfactory;

s1002、内部通过dualsim类的getsubid()函数来获取两个卡槽对应的id;

s1003、声明可调用函数sendsms(string,string,int)来进一步调用hrstsmsmanager类中的sendsms()函数来实现选择android移动终端卡槽对应的手机卡来进行短信发送。

本发明相对于现有技术具有如下的优点及效果:

相对于android官方提供的api只能使用默认sim来发送短信,本发明还支持指定sim卡来发送短信,而且经过封装后调用方式更加简单便捷。

附图说明

图1是本发明中获取双卡槽id流程图;

图2是本发明中反射短信类设置对应发送卡槽中的sim卡流程图。

具体实施方式

为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

实施例

本实施例将结合附图,通过对本发明的具体实施方式详细描述,将使本发明的技术方案及有益效果更显而易见。

图1和图2分别为本发明中获取双卡槽id以及反射短信类设置对应发送卡槽中的sim卡流程图。

步骤s1、基于window操作系统,并安装好java的开发环境jdk、eclipse等;

步骤s2、android移动终端进行root和并安装xposed框架;

步骤s3、拥有一个android项目,新建或者导入现有项目;

步骤s4、在网上下载xposedbridgeapi-42.jar的jar包;

步骤s5、导入到android项目新建的lib目录中,并对其buildpath操作;

步骤s6、编写hook“android.telephony.subscriptionmanager”类中“getsubid(int)”函数的实参数据的程序,并用文件保存在所hook得到的数据到对应的目录下。

具体实施方式中,该步骤s6具体如下:

步骤s601、新建类并实现xposedbridgeapi-42.jar中的ixposedhookloadpackage接口;

步骤s602、在实现ixposedhookloadpackage接口的handleloadpackage(loadpackageparamlpparam)函数中判断系统加载的包名是否是“com.android.mms”,如不属于则不会执行下面的步骤;

步骤s603、利用xposedhelpers.findandhookmethod函数来对android.telephony.subscriptionmanager类中的getsubid(int)函数进行监听;

步骤s604、将监听到的param.args[0]和(int[])param.getresult())[0]分别保存到phoneid0.txt和phoneid1.txt文件中。此时已得到卡槽中对应的id。

步骤s7、编写短信发送类;

步骤s8、在发送类中利用反射技术来对“android.telephony.smsmanager”类的“msubid”字段用步骤s5获取到的数据来对该字段进行指定sim卡的赋值。

具体实施方式中,该步骤s8具体如下:

s81、反射“android.telephony.smsmanager”类的”msubid”字段,具体过程如下:

s811、当android版本为5.0或以后的版本时,对android.telephony.smsmanager类的getdefault()函数进行反射获取该类的对象;

s812、获取android.telephony.smsmanager类中的msubid字段的访问权限;

s813、由于msubid字段为私有字段,需要通过反射机制获取对该字段的修改权限。

s82、获取步骤s5保存文件的数据,具体过程如下:

s821、新建一个处理双卡的类,暂命名为dualsim;

s822、在dualsim类中声明两个int型字段用来记录卡槽的id值,分别为msub1和msub2;

s823、增加读取文件的函数,用来读取之前记录在本地phoneid0.txt和phoneid1.txt中的内容;

s824、并把两个文件中的内容分别赋值到msub1和msub2中。

步骤s9、利用反射技术对“sendtextmessage”函数进行传参即可实现短信的发送。

具体实施方式中,该步骤s9分为3个子步骤,具体如下:

s91、编写发送短信接口icustomsms,并声明接口函数为sendtextmessage,并对其设置形参(

目标号码(dstaddress),

短信中心服务码(scaddress),

内容(text),

发送短信结果状态信号(sentintent),

对方接收状态信号(deliveryintent),

卡槽id值(cardid));

s92、实现短信接口的管理类,并对“sendtextmessage”方法进行抽象,具体过程如下:

s921、新建一个短信接口管理类(smsinterfacefactory)并实现上面的icustomsms接口;

s922、在smsinterfacefactory内部类中声明geticustomsms函数来根据系统版本的初始化反射android.telephony.smsmanager后获取类的实例化对象,并通过反射机制来设置允许访问私有参数的权限和允许访问msubid字段的权限。

该步骤s922具体过程如下:

s9221、声明引用对象smsmanager和cardidfield,其中smsmanager持有android.telephony.smsmanager类的对象,其中cardidfield持有android.telephony.smsmanager中msubid字段;

s9222、获取并设置相关的权限;其中,该步骤s9222具体如下:

首先,通过反射机制android.telephony.smsmanager类中的getdefault()函数来获取短信管理类的对象,并将该对象交给smsmanager进行持有;

然后,通过反色机制获取访问msubid字段的权限,并交由cardidfield来进行持有;

最后,通过反色机制来设置允许访问私有参数。

s9223、匹配获取当前系统具体的短信发送方案;其中,该步骤s9223具体如下:

首先,初始化短信接口工厂类(smsinterfacefactory)为factory;

其次,重写smsinterfacefactory类中的sendtextmessage(string,string,string,pendingintent,pendingintent,int)函数;该步骤具体如下:

(1)设置发送短信移动终端卡槽的id;

(2)反射sendtextmessage函数中的参数,并进行调用;

(3)通过反射机制获取系统中的sendtextmessage(string,string,string,pendingintent,pendingintent)函数;

(4)设置可通过反射来调用该函数。

s9224、对外提供一个抽象的函数sendtextmessage(string,string,string,pendingintent,pendingintent,int)让子类去实现或重写改函数.这样可通过该函数来实现。

s93、重写“sendtextmessage”方法,并用发送短信接口进行调用发送。该步骤具体如下:新建管理类hrstsmsmanager,首先,内部持有icustomsms接口的引用对象;然后,声明外部可调用函数sendsms(string,string,int),内部已通过smsinterfacefactory.geticustomsms()初始化icustomsms的引用对象,并通过该引用对象来调用sendtextmessage(string,string,string,pendingintent,pendingintent,int)。

步骤s10、对该实现进一步封装,方便直接进行调用。

该步骤s10具体过程如下:

s1001、新建短信工厂管理类hrstsmsmanagerfactory;

s1002、内部通过dualsim类的getsubid()函数来获取两个卡槽对应的id;

s1003、声明可调用函数sendsms(string,string,int)来进一步调用hrstsmsmanager类中的sendsms()函数来实现选择android移动终端卡槽对应的手机卡来进行短信发送。

综上所述,上述实施例公开的一种基于android系统的实现双卡发送短信方法,该方法通过在windows操作系统上,用java语言及第三方库xposedbridgeapi-42.jar来实现hook获取数据参数,使得双卡android移动终端上的第三方的短信app可以指定sim卡来发送短信。

上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1