2016-09-28 7 views
0

Я пробовал с кодом, указанным по этой ссылке How to send a SMS using SMSmanager in Dual SIM mobile? Я использовал имя для simID is isms_msim.Как отправить SMS с использованием java-отражения в Dual SIM mobile Moto E (версия для Android 4.4.4)?

try { 
     if (simID == 0) { 
      name = "isms"; 
     } else if (simID == 1) { 
      name = "isms_msim"; 
     } else { 
      throw new Exception("can not get service which for sim '" + simID + "', only 0,1 accepted as values"); 
     } 
     Method method = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", String.class); 
     method.setAccessible(true); 
     Object param = method.invoke(null, name); 

     method = Class.forName("com.android.internal.telephony.ISms$Stub").getDeclaredMethod("asInterface", IBinder.class); 
     method.setAccessible(true); 
     Object stubObj = method.invoke(null, param); 
     if (Build.VERSION.SDK_INT < 18) { 
      method = stubObj.getClass().getMethod("sendMultipartText", String.class, String.class, List.class, List.class, List.class); 
      method.invoke(stubObj, toNum, centerNum, smsTextlist, sentIntentList, deliveryIntentList); 
     } else { 
      method = stubObj.getClass().getMethod("sendMultipartText", String.class, String.class, String.class, List.class, List.class, List.class); 
     ===> method.invoke(stubObj, ctx.getPackageName(), toNum, centerNum, smsTextlist, sentIntentList, deliveryIntentList); 
     } 
     return true; 
    } catch (ClassNotFoundException e) { 
     Logger.Log(TAG, Logger.LogLevel.ERROR, "Error while sending multiple sms, stack trace: " + e.getStackTrace()); 
    } catch (NoSuchMethodException e) { 
     Logger.Log(TAG, Logger.LogLevel.ERROR, "Error while sending multiple sms, stack trace: " + e.getStackTrace()); 
    } catch (InvocationTargetException e) { 
     Logger.Log(TAG, Logger.LogLevel.ERROR, "Error while sending multiple sms, stack trace: " + e.getStackTrace()); 
    } catch (IllegalAccessException e) { 
     Logger.Log(TAG, Logger.LogLevel.ERROR, "Error while sending multiple sms, stack trace: " + e.getStackTrace()); 
    } catch (Exception e) { 
     Logger.Log(TAG, Logger.LogLevel.ERROR, "Error while sending multiple sms, stack trace: " + e.getStackTrace()); 
    } 

но этот код дает следующее исключение в строке начинается с ===> в блоке еще: SecurityException: Binder вызов к неверному интерфейсу

Любая идея по этому поводу?

+0

Правильно добавьте свои журналы ошибок. Как и ваш код. НЕТ Нам не нравится представлять, как проходит ваш код. Мы не Джон Леннон. –

+0

Используйте break-point и пошаговую отладку для проверки того, что возвращаемая служба действительно относится к классу 'com.android.internal.telephony.ISms $ Stub'. – Robert

+0

обновленный код. Код работает отлично для simID == 0 и name = "isms". Он дает исключение в случае simID == 1 и isms_msim. Я хочу реализовать Dual SIM feauture для уровня API 19, который не поддерживается андроидом (согласно документации). –

ответ

0

Я получил решение самостоятельно, проведя некоторое время. вызывают API от https://github.com/gp-b2g/frameworks_base/blob/master/telephony/java/android/telephony/MSimSmsManager.java и https://github.com/gp-b2g/frameworks_base/blob/master/telephony/java/android/telephony/MSimTelephonyManager.java файл java reflection для получения информации о подписке и для отправки SMS.