7

I would like to check which SIM is making an outgoing call for DUAL SIM android phones. Read this article Android : Check whether the phone is dual SIM.

Works like a charm, detects the sim state and if phone is dual SIM. Next step is to get SIM info during an outgoing call request so that i know which SIM is making the call and according to that take some action.

Can someone help me with that?

Community
  • 1
  • 1
Dionisis K.
  • 171
  • 1
  • 1
  • 7

5 Answers5

7

I've tested and for Jelly Bean I was able to successfully identify the dialling SIM card. Tested also with triple SIM device and worked like a charm.

Code snippet for this inside your BroadcastReceiver:

int whichSIM = 0; // this for security fallback to SIM 1

if (intent.getExtras().containsKey("subscription")) {

    whichSIM = intent.getExtras().getInt("subscription");

}

// do whatever you need to with the information
Qantas 94 Heavy
  • 15,750
  • 31
  • 68
  • 83
Fernando Rama
  • 71
  • 1
  • 2
2

You can create BroadcastReceiver, which will accept all outgoing calls. Then:

    String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    int slot=intent.getIntExtra("com.android.phone.extra.slot",-1); 
    //0 or 1 are valid in my case

number is dialed number
slot is through which slot you make that call
You will need to register that receiver, and give proper permissions. This works for dialed USSD codes also. It is tested on Privileg GSM S7589 2 SIM cards, Android 4.2.1

  • Tested 2 phones (1 privileg) (always get slot -1) inline `public class OutgoingCallInterceptor extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); int slot=intent.getIntExtra("com.android.phone.extra.slot",-1); //0 or 1 are valid in my case Toast.makeText(context.getApplicationContext(), "Slot: " + slot + ", Number: " + number, Toast.LENGTH_LONG).show(); // Abort OLD Call abortBroadcast(); setResultData(null); } }` – Dionisis K. Sep 24 '13 at 15:59
2

You can use PhoneStateListener after the call you can determine the outgoing call was from sim 1 or sim2 as shown in the code below.

    private class CallStateListener extends PhoneStateListener {


   @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            //super.onCallStateChanged(state, incomingNumber);

            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:
                 Log.i(TAG, "Idle " + state);
                //when Idle i.e no call
                if (flag.equals("outgoingcall") ) {

                    // Put in delay because call log is not updated immediately
                    // when state changed
                    // The dialler takes a little bit of time to write to it
                    // 500ms seems to be enough
                    handler.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            // get start of cursor
                            Log.i("CallLogDetailsActivity","Getting Log activity...");

                            cur = ctx.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null,null, CallLog.Calls.DATE + " desc");

                            int number = cur.getColumnIndex(CallLog.Calls.NUMBER);
                            int type = cur.getColumnIndex(CallLog.Calls.TYPE);
                            int date = cur.getColumnIndex(CallLog.Calls.DATE);
                            int duration = cur.getColumnIndex(CallLog.Calls.DURATION);
                            //Check if call was made from sim 1 or sim 2 , if it returns 0 its from sim 1 else if 1 its from sim 2.
                            int idSimId = getSimIdColumn(cur);
                            String callid = "0";

                            if (cur.moveToFirst() == true) {
                                phNumber = cur.getString(number);
                                callType = cur.getString(type);
                                callDate = cur.getString(date);
                                callDayTime = new Date(Long.valueOf(callDate));
                                callDuration = Integer.valueOf(cur.getString(duration));
                                dir = null;
                                int dircode = Integer.parseInt(callType);

                                switch (dircode) {
                                case CallLog.Calls.OUTGOING_TYPE:
                                    dir = "OUTGOING";
                                    break;

                                case CallLog.Calls.INCOMING_TYPE:
                                    dir = "INCOMING";
                                    break;

                                case CallLog.Calls.MISSED_TYPE:
                                    dir = "MISSED";
                                    break;

                                }


                                if(idSimId >= 0){
                                    callid = cur.getString(idSimId);
                                    }


                                cur.close();
                                TelephonyInfo telephonyInfo = TelephonyInfo.getInstance(ctx);

                                boolean isDualSIM = telephonyInfo.isDualSIM();


                                if (isDualSIM) {
                                    if(callid.equals("1")){
                                        simserailno = telephonyInfo.getImeiSIM2();
                                    }else {
                                        simserailno = telephonyInfo.getImeiSIM1();
                                    }
                                } else {

                                    simserailno = tmgr.getSimSerialNumber();
                                }




                                if (tmgr.isNetworkRoaming()) {
                                    roaming = 1;
                                } else {
                                    roaming = 0;
                                }


                                SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


                                StringBuffer sb = new StringBuffer();
                                sb.append("Outgoing Call Log" 
                                        + "\nPhone Number:--- " + phNumber
                                        + " \nCall Type:--- " + dir
                                        + " \nCall Date:--- " + sdfDate.format(Long.valueOf(callDate))
                                        + " \nDual isDualSIM:--- " + isDualSIM
                                        + " \nSIM 1 imei:--- "  + telephonyInfo.getImeiSIM1()
                                        + " \nSIM 2 imei:--- "  + telephonyInfo.getImeiSIM2()
                                        + " \nCalling Sim:--- " + callid
                                        + " \nDevice Number :--- " + Imeinumber
                                        + " \nSim Number :--- " + simserailno
                                        + " \nSubcscriber Number :--- " + subidno
                                        + " \nRoaming :--- " + tmgr.isNetworkRoaming()
                                        + " \nCall duration in sec :--- " + callDuration);
                                sb.append("\n----------------------------------");
                                Log.i("sb", sb.toString());

                                Toast.makeText(ctx, sb.toString(),Toast.LENGTH_LONG).show();

                            }

                            flag = "";


                        }
                    }, 1500);



                }

                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                Log.i(TAG, "offhook " + state);


                    flag= "outgoingcall";


                break;
            case TelephonyManager.CALL_STATE_RINGING:
                Log.i(TAG, "Ringing " + state);
                  //when Ringing
                 // Log.i(TAG, "Incomng Number to sim1: " + incomingNumber);
                  String msg = "Detected Incoming Call number: " + incomingNumber;
                  Toast.makeText(ctx, msg, Toast.LENGTH_LONG).show();
                  flag = "oncall";
                break;
            default:
                break;
            }
     }

}

Code snippet for detecting if call was made from sim 1 or sim 2

    public static int getSimIdColumn(final Cursor c) {

    for (String s : new String[] { "sim_id", "simid", "sub_id" }) {
        int id = c.getColumnIndex(s);
        if (id >= 0) {
            Log.d(TAG, "sim_id column found: " + s);
            return id;
        }
    }
    Log.d(TAG, "no sim_id column found");
    return -1;
}
Rayyidh
  • 21
  • 4
0
intent.putExtra("simSlot", 0); //For sim 1

intent.putExtra("simSlot", 1); //For sim 2

Refer this link

Call from second sim

Community
  • 1
  • 1
Gayathiri
  • 427
  • 1
  • 4
  • 9
-1

There is network in the database CallLog.Calls, you can get it from there.

Flygenring
  • 3,818
  • 1
  • 32
  • 39
Levid
  • 1
  • 1
  • How? Can you please explain? – Rachcha Feb 19 '14 at 11:52
  • Can this be used to get the information at the time of the outgoing call request? If so, could you please explain? – Flygenring Feb 19 '14 at 11:55
  • 1
    there is nothing as network in CallLog.Calls database, some manufacturers have sim_id, or simno but each one has a different implementation and there is no generic implementation yet. – dirtydexter Apr 15 '14 at 07:47