通过反射发现sendMultipartTextMessage多了一个phoneType的参数,这个参数就是这只用GMS还是CDMA卡发送的。

phoneType获取方法,iTelephony.getActivePhoneType();//1=GSM,2=CDMA

  1. try {
  2. Class<?> smsManagerClass = null;
  3. Class[] divideMessagePamas = { String.class };
  4. Class[] sendMultipartTextMessagePamas = { String.class,String.class,
    ArrayList.class, ArrayList.class,ArrayList.class, int.class };
  5. Method divideMessage = null;
  6. Method sendMultipartTextMessage = null;
  7. smsManagerClass = Class.forName("android.telephony.SmsManager");
  8. Method method = smsManagerClass.getMethod("getDefault", new
    Class[]{});
  9. Object smsManager = method.invoke(smsManagerClass, new Object[]{});
  10. divideMessage =
    smsManagerClass.getMethod("divideMessage",divideMessagePamas);
  11. sendMultipartTextMessage =
    smsManagerClass.getMethod("sendMultipartTextMessage",
    sendMultipartTextMessagePamas);
  12. ArrayList<String> magArray = (ArrayList<String>)
    divideMessage.invoke(smsManager, content);
  13. sendMultipartTextMessage.invoke(smsManager,phone, "", magArray,
    null, null,phoneType);
  14. } catch (IllegalArgumentException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. } catch (IllegalAccessException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. } catch (InvocationTargetException e) {
  21. // TODO Auto-generated catch block
  22. e.printStackTrace();
  23. } catch (ClassNotFoundException e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. } catch (SecurityException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. } catch (NoSuchMethodException e) {
  30. // TODO Auto-generated catch block
  31. e.printStackTrace();
  32. }

判断手机是否为双卡:

  1. public static void initIsDoubleTelephone(Context context){
  2. boolean isDouble = true;
  3. Method method = null;
  4. Object result_0 = null;
  5. Object result_1 = null;
  6. TelephonyManager tm = (TelephonyManager)
    context.getSystemService(Context.TELEPHONY_SERVICE);
  7. try {
  8. //只要在反射getSimStateGemini 这个函数时报了错就是单卡手机(这是我自己的经验,不一定全正确)
  9. method = TelephonyManager.class.getMethod("getSimStateGemini",new Class[] {
    int.class });
  10. //获取SIM卡1
  11. result_0 = method.invoke(tm, new Object[] { new Integer(0) });
  12. //获取SIM卡1
  13. result_1 = method.invoke(tm, new Object[] { new Integer(1) });
  14. } catch (SecurityException e) {
  15. isDouble = false;
  16. e.printStackTrace();
  17. //System.out.println("1_ISSINGLETELEPHONE:"+e.toString());
  18. } catch (NoSuchMethodException e) {
  19. isDouble = false;
  20. e.printStackTrace();
  21. //System.out.println("2_ISSINGLETELEPHONE:"+e.toString());
  22. } catch (IllegalArgumentException e) {
  23. isDouble = false;
  24. e.printStackTrace();
  25. } catch (IllegalAccessException e) {
  26. isDouble = false;
  27. e.printStackTrace();
  28. } catch (InvocationTargetException e) {
  29. isDouble = false;
  30. e.printStackTrace();
  31. } catch (Exception e){
  32. isDouble = false;
  33. e.printStackTrace();
  34. //System.out.println("3_ISSINGLETELEPHONE:"+e.toString());
  35. }
  36. SharedPreferences sp =
    PreferenceManager.getDefaultSharedPreferences(context);
  37. Editor editor = sp.edit();
  38. if(isDouble){
  39. //保存为双卡手机
  40. editor.putBoolean(ISDOUBLE, true);
  41. //保存双卡是否可用
  42. //如下判断哪个卡可用.双卡都可以用
  43. if(result_0.toString().equals("5") &&
    result_1.toString().equals("5")){
  44. if(!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD,
    "2").equals("1")){
  45. editor.putString(SIMCARD, "0");
  46. }
  47. editor.putBoolean(SIMCARD_1, true);
  48. editor.putBoolean(SIMCARD_2, true);
  49. } else if(!result_0.toString().equals("5") &&
    result_1.toString().equals("5")){//卡二可用
  50. if(!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD,
    "2").equals("1")){
  51. editor.putString(SIMCARD, "1");
  52. }
  53. editor.putBoolean(SIMCARD_1, false);
  54. editor.putBoolean(SIMCARD_2, true);
  55. } else if(result_0.toString().equals("5") &&
    !result_1.toString().equals("5")){//卡一可用
  56. if(!sp.getString(SIMCARD, "2").equals("0") && !sp.getString(SIMCARD,
    "2").equals("1")){
  57. editor.putString(SIMCARD, "0");
  58. }
  59. editor.putBoolean(SIMCARD_1, true);
  60. editor.putBoolean(SIMCARD_2, false);
  61. } else {//两个卡都不可用(飞行模式会出现这种种情况)
  62. editor.putBoolean(SIMCARD_1, false);
  63. editor.putBoolean(SIMCARD_2, false);
  64. }
  65. }else{
  66. //保存为单卡手机
  67. editor.putString(SIMCARD, "0");
  68. editor.putBoolean(ISDOUBLE, false);
  69. }
  70. editor.commit();
  71. }

android 双卡手机发短信/判断手机是否为双卡的更多相关文章

  1. 向android模拟器打电话发短信的简单方法

    在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这 ...

  2. android打电话、发短信实现

    打电话: Intent intent = newIntent(Intent.ACTION_CALL,Uri.parse("tel:"+"156666666666" ...

  3. Android——SMS接收发短信与运行权限

    好久没写了,最近学习Android的相关知识,包括UI组件与布局.Activity生命周期等,而这次要讲的是,Broadcast Receiver的相关知识,主要是接收发短信,SmsManager.S ...

  4. 如何向Android模拟器打电话发短信

    1. 启动Android Emulator, 查看标题栏找出端口.一般是android emulator(5554),其中5554就是端口. 2. 打开命令行,输入telnet localhost 5 ...

  5. 【转】如何向Android模拟器打电话发短信

    转载地址:http://hi.baidu.com/jeremylai/item/420f9c9fe4881fccb62531f7 1. 启动Android Emulator, 查看标题栏找出端口.一般 ...

  6. 使用Python往手机发送短信(基于twilio模块)

    官网是https://www.twilio.com twilio的一句话介绍——提供SDK帮你连接世界上所有人,你可以很方便的调用他们提供的接口来给指定手机发短信,打电话. 首先在twilio的官网注 ...

  7. Android Tips: 打电话和发短信

    利用Android打电话非常简单,直接调用Android内在的电话功能就可以了. btnDail.setOnClickListener(new OnClickListener(){ @Override ...

  8. 【319】Python 通过 Twilio 发短信

    参考:python利用twilio模块给自己发短信 参考:使用python实现往手机发短信(基于twilio) 步骤如下: 登录 Twilio 网站注册,貌似需要***,包括用户名.密码.手机号.项目 ...

  9. Android实例-打电话、发短信和邮件,取得手机IMEI号(XE8+小米2)

    结果: 1.不提示发短信卡住,点击没有反映,我猜想,可能是因为我用的是小米手机吧. 2.接收短信报错,我猜想可能是我改了里面的方法吧(哪位大神了解,求指教). 3.project -->opti ...

随机推荐

  1. CSS3------background-size(背景图片尺寸属性)

    background-size 可以设置背景图片的大小,数值包括 长度length和百分比percentage. 并且会根据背景原点位置 background-origin 设置其图片覆盖的范围.那么 ...

  2. 隐藏 Status Bar

    iOS6和iOS7在隐藏 Status Bar 三种方式比较: Storyboard 界面上选中UIViewController,最右边Simulated Metrics找到 Status Bar 设 ...

  3. 第 8 章 适配器模式【Adapter Pattern】

    以下内容出自:<<24种设计模式介绍与6大设计原则>> 好,请安静,后排聊天的同学别吵醒前排睡觉的同学了,大家要相互理解嘛.今天讲适配器模式,这个模式也很简单,你笔记本上的那个 ...

  4. JNI/NDK开发指南(二)——JVM查找java native方法的规则

    通过第一篇文章,大家明白了调用native方法之前,首先要调用System.loadLibrary接口加载一个实现了native方法的动态库才能正常访问,否则就会抛出java.lang.Unsatis ...

  5. JQuery replace 替换全部

    天在做写个程序时遇到需要替换的功能,可是一开始用jquery的replace时,发现只替换到第一个.最后没办法,只好用正则表达式来例如下面   re = new RegExp("{thisc ...

  6. SharedPreference.Editor的apply跟commit方法的異同

    相同点: 1.二者都可提交preference的修改数据 2.二者都是原子操作 区别: 1.apply没有返回值而commit返回boolean表明修改是否提交成功 2.apply是将修改数据原子提交 ...

  7. Oracle 创建用户相关

    表空间 Oracle数据库是通过表空间来存储物理表的,一个数据库实例可以有N个表空间,一个表空间下可以有N张表. 有了数据库,就可以创建表空间. 表空间(tablespace)是数据库的逻辑划分,每个 ...

  8. git svn cygwin_exception

    git for windows 2.5 版本发布了,更新之后,使用git svn的时候,就出错 git svn rebase Or git svn dcommit After a update git ...

  9. King(差分约束)

    http://poj.org/problem?id=1364 题意真心看不大懂啊... 现在假设有一个这样的序列,S={a1,a2,a3,a4...ai...at}其中ai=a*si,其实这句可以忽略 ...

  10. 微软开放技术发布开源 Jenkins 插件以将 Windows Azure Blob 服务用的开作存储库

     发布于 2014-02-10 作者 陈 忠岳 持续集成 (CI) 的历史源远流长, 其宗旨在于软件团队在敏捷环境中不断将他们的工作整合为持续构建.管理 CI 进程的工具已存在一段时间.过去几年中 ...