How to find out which SIM card is making an outgoing call (Dual SIM)

I would like to check which SIM card is making an outgoing call for DUAL SIM android phones. Read this Android article : check if your phone is a dual SIM card .

It works like a charm, detects the state of the simulator, and if the phone has a dual SIM card. The next step is to obtain information about the SIM card during an outgoing call request, so that I know which SIM system is making the call, and will take some actions accordingly.

Can someone help me?

+6
source share
5 answers

I tested and for Jelly Bean I was able to successfully identify the SIM card set. It is also tested with a device with three SIM cards and works like a charm.

The snippet code 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 
+7
source

You can create a BroadcastReceiver that 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 β€” dialed number in the slot β€” through which slot do you make this call
You will need to register this receiver and provide appropriate permissions. This also works for USSD dialed codes. It has been tested on Privileg GSM S7589 2 SIM SIM cards, Android 4.2.1

+2
source

You can use PhoneStateListener after the call, which you can determine if 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 ie 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 to detect if a 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; } 
+2
source
 intent.putExtra("simSlot", 0); //For sim 1 intent.putExtra("simSlot", 1); //For sim 2 

Link to this link

Call from the second sim

0
source

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

-1
source

Source: https://habr.com/ru/post/953308/


All Articles