2013-09-06 23 views
6

Chciałbym sprawdzić, która karta SIM nawiązuje połączenie wychodzące na telefony z systemem Android DUAL SIM. Przeczytaj ten artykuł Android : Check whether the phone is dual SIM.Jak sprawdzić, która karta SIM nawiązuje połączenie wychodzące (Dual SIM)?

Działa jak zaklęcie, wykrywa stan sim i jeśli telefon ma podwójną kartę SIM. Kolejnym krokiem jest uzyskanie informacji o karcie SIM podczas połączenia wychodzącego, aby wiedzieć, która karta SIM nawiązuje połączenie i zgodnie z nią podjąć pewne działania.

Czy ktoś może mi w tym pomóc?

Odpowiedz

2

Możesz utworzyć BroadcastReceiver, który będzie akceptował wszystkie połączenia wychodzące. Następnie:

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 

numer jest wybierany numer
gniazdo jest szczelina, przez którą możesz zrobić to wezwanie
Musisz zarejestrować tego odbiornika, i dać odpowiednie uprawnienia. Działa to również dla wybieranych kodów USSD. Jest testowany na kartach SIM Privileg GSM S7589 2, Android 4.2.1

+0

Przetestowane 2 telefony (1 PRIVILEG) (zawsze uzyskać szczelinę -1) inline 'public class OutgoingCallInterceptor rozciąga BroadcastReceiver { \t \t @Override public void onReceive (kontekst kontekst, Intent intent) { \t \t \t \t Numer ciągu = intent.getStringExtra (Intent.EXTRA_PHONE_NUMBER); \t int slot = intent.getIntExtra ("com.android.phone.extra.slot", - 1); \t // 0 lub 1 są ważne w moim przypadku \t \t \t \t Toast.makeText (context.getApplicationContext(), "Gniazdo" + gniazdo + "Numer:" + liczba, Toast.LENGTH_LONG).pokazać(); \t // Przerwij stare połączenie abortBroadcast(); setResultData (null); \t} } ' –

7

Testowałem i dla Jelly Bean udało mi się z powodzeniem zidentyfikować kartę SIM wybieraną. Testowany również z potrójnym urządzeniem SIM i działał jak czar.

Fragment kodu za to wewnątrz 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 
+0

To zadziałało również jak urok. Dzięki! – williamlopes

-1

Jest network w bazie danych CallLog.Calls, można dostać go stamtąd.

+0

Jak? Czy możesz wyjaśnić? – Rachcha

+0

Czy można to wykorzystać do uzyskania informacji w czasie żądania połączenia wychodzącego? Jeśli tak, czy mógłbyś wyjaśnić? – Flygenring

+0

sry, może po prostu uzyskać informacje po zakończeniu połączenia ... – Levid

2

Możesz użyć PhoneStateListener po tym, jak możesz sprawdzić, czy połączenie wychodzące pochodzi z karty SIM 1 lub karty SIM2, jak pokazano w poniższym kodzie.

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; 
      } 
    } 

} 

Fragment kodu do wykrywania, czy połączenie zostało wykonane z SIM 1 lub 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; 
} 
+0

callid = cur.getString (idSimId) zwróci mi liczbę taką jak "899103011100 ......" i myślę, że jest to "ICCID". –

+0

czy możesz opublikować pełną klasę .. co to jest cur, tmgr, dir, flag .. proszę zaktualizować – Android

Powiązane problemy