title: Android: How to send sms with particular SIM in dual sim mobiles?
body: <p>I found some <a href="https://stackoverflow.com/questions/27351936/how-to-send-a-sms-using-smsmanager-in-dual-sim-mobile/30677542#30677542">code</a> to do this, but It's giving me an exception ( Attempt to invoke virtual method 'java.lang.Class java.lang.Object.getClass()' on a null object reference). I am testing with my Moto G 3rd Gen. Below is the code, Please let me know if I am missing anything or any other approach are available. Thank you. </p>
  
  <pre><code>import android.app.PendingIntent;
  import android.content.Context;
  import android.os.IBinder;
  import android.util.Log;
  
  import java.lang.reflect.InvocationTargetException;
  import java.lang.reflect.Method;
  
  
  public class SimUtil {
  
      private static final String TAG = "SimUtil";
  
      public static boolean sendSMS(Context ctx, int simID, String toNum, String centerNum, String smsText, PendingIntent sentIntent, PendingIntent deliveryIntent) {
  
         SimUtil cls = new SimUtil();
  
          String name;
  
          try {
              if (simID == 0) {
                  name = "isms";
  
              } else if (simID == 1) {
                  name = "isms2";
  
              } else {
                  throw new Exception("can not get service which for sim '" + simID + "', only 0,1 accepted as values");
              }
  
              try
              {
                  Method method = Class.forName("android.os.ServiceManager").getDeclaredMethod("getService", new Class[]{String.class});
                  method.setAccessible(true);
                  Object param = method.invoke(null, new Object[]{name});
  
                  if (param == null)
                  {
                      throw new RuntimeException("can not get service which is named '" + name + "'");
                  }
                  method = Class.forName("com.android.internal.telephony.ISms$Stub").getDeclaredMethod("asInterface", new Class[]{IBinder.class});
                  method.setAccessible(true);
                  Object stubObj = method.invoke(null, new Object[]{param});
  
                  if (stubObj == null)
                  {
                      throw new RuntimeException("can not get telephony which is named '" + name + "'");
                  }
  
  
                  method = stubObj.getClass().getMethod("sendText", String.class, String.class, String.class, String.class, PendingIntent.class, PendingIntent.class);
  
                  method.invoke(null, new Object[]{ctx.getPackageName(), toNum, null, smsText, sentIntent, deliveryIntent});
  
  
              } catch (ClassNotFoundException e)
              {
                  throw new RuntimeException(e);
              } catch (NoSuchMethodException e)
              {
                  throw new RuntimeException(e);
              } catch (InvocationTargetException e)
              {
                  throw new RuntimeException(e);
              } catch (IllegalAccessException e)
              {
                  throw new RuntimeException(e);
              }
  
              return true;
          } catch (ClassNotFoundException e) {
              Log.e("Exception", "ClassNotFoundException:" + e.getMessage());
          } catch (NoSuchMethodException e) {
              Log.e("Exception", "NoSuchMethodException:" + e.getMessage());
          } catch (InvocationTargetException e) {
              Log.e("Exception", "InvocationTargetException:" + e.getMessage());
          } catch (IllegalAccessException e) {
              Log.e("Exception", "IllegalAccessException:" + e.getMessage());
          } catch (Exception e) {
              Log.e("Exception", "Exception:" + e);
          }
          return false;
      }
  </code></pre>