0

I am stuck for a long time and can't solve it. Please help... I am trying to send sms programmatically from android device. I can send successfully from many devices but can't from some Samsung dual sim devices with android api level >=22. For api level >=22 I have coded like,

public static final String SMS_SENT_ACTION = "package.name.app.SMS_SENT_ACTION";

registerReceiver(new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        unregisterReceiver(this);
        String message = null;
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                message = "Message Sent Successfully !";
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                message = "Error.";
                sendDefaultMessage(default_number, default_send_number, text);
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                message = "Error: No service.";
                sendDefaultMessage(default_number, default_send_number, text);
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                message = "Error: Null PDU.";
                sendDefaultMessage(default_number, default_send_number, text);
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                message = "Error: Radio off.";
                sendDefaultMessage(default_number, default_send_number, text);
                break;
        }

        Toast.makeText(GetAppointment.this, message, Toast.LENGTH_LONG).show();

    }
}, new IntentFilter(SMS_SENT_ACTION));


SmsManager.getSmsManagerForSubscriptionId(subscription_id).sendTextMessage(send_number, null, messageToSend, PendingIntent.getBroadcast(
                    this, 0, new Intent(SMS_SENT_ACTION), 0), null);

There is no permission related issue because sms can be sent from asus dual sim device and sony single sim device with api level >=22.

How can I make it work for all device? I need help badly.

Exigente05
  • 2,161
  • 3
  • 22
  • 42
  • it will be helpful for you http://stackoverflow.com/questions/27351936/how-to-send-a-sms-using-smsmanager-in-dual-sim-mobile – sasikumar Jan 04 '17 at 04:47
  • I have followed this example - SmsManager.getSmsManagerForSubscriptionId(int subscriptionId).sendTextMessage(String destinationAddress, String scAddress, String text,PendingIntent sentIntent, PendingIntent deliveryIntent); – Exigente05 Jan 04 '17 at 04:49

2 Answers2

0

You need to provide service center number of SIM you want to send SMS from in your sendTextMessage() as second parameter like,

SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNumber, "+9198********", msg, null, null);
Jaymin Panchal
  • 2,797
  • 2
  • 27
  • 31
  • how will I get service center number programmatically? – Exigente05 Jan 04 '17 at 18:18
  • I have reaserched about it and Found `Telephony.TextBasedSmsColumns` https://developer.android.com/reference/android/provider/Telephony.TextBasedSmsColumns.html Hope it helps. – Jaymin Panchal Jan 04 '17 at 18:37
  • After using service center number its giving me RESULT_ERROR_GENERIC_FAILURE error if I try to send sms from not default sim. – Exigente05 Jan 12 '17 at 20:23
0

Then check sim settings using following function:

public int  getDefaultSimmm(Context context) {

Object tm = context.getSystemService(Context.TELEPHONY_SERVICE);
Method method_getDefaultSim;
int defaultSimm = -1;
try {
    method_getDefaultSim = tm.getClass().getDeclaredMethod("getDefaultSim");
    method_getDefaultSim.setAccessible(true);
    defaultSimm = (Integer) method_getDefaultSim.invoke(tm);
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Method method_getSmsDefaultSim;
int smsDefaultSim = -1;
try {
    method_getSmsDefaultSim = tm.getClass().getDeclaredMethod("getSmsDefaultSim");
    smsDefaultSim = (Integer) method_getSmsDefaultSim.invoke(tm);
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
return smsDefaultSim;
}

Then following function send sms:

public boolean sendSMS(Context ctx, int simID, String toNum, String centerNum, String smsText, PendingIntent sentIntent, PendingIntent deliveryIntent) {
    String name;

    try {
        if (simID == 0) {
            name = "isms";
            // for model : "Philips T939" name = "isms0"
        } else if (simID == 1) {
            name = "isms2";
        } 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("sendText", String.class, String.class, String.class, PendingIntent.class, PendingIntent.class);
            method.invoke(stubObj, toNum, centerNum, smsText, sentIntent, deliveryIntent);
        } else {
            method = stubObj.getClass().getMethod("sendText", String.class, String.class, String.class, String.class, PendingIntent.class, PendingIntent.class);
            method.invoke(stubObj, ctx.getPackageName(), toNum, centerNum, smsText, sentIntent, deliveryIntent);
        }

        return true;
    } catch (ClassNotFoundException e) {
        Log.e("apipas", "ClassNotFoundException:" + e.getMessage());
    } catch (NoSuchMethodException e) {
        Log.e("apipas", "NoSuchMethodException:" + e.getMessage());
    } catch (InvocationTargetException e) {
        Log.e("apipas", "InvocationTargetException:" + e.getMessage());
    } catch (IllegalAccessException e) {
        Log.e("apipas", "IllegalAccessException:" + e.getMessage());
    } catch (Exception e) {
        Log.e("apipas", "Exception:" + e.getMessage());
    }
    return false;
}

I hope it will help you

Rahul Karande
  • 259
  • 2
  • 9