1

How to get dual sim number call logs in android. I followed below link to get the dual sim call logs but this method returns -1 always. I tried other stackoverflow not much answers for dual sim call logs which is available from api 21. https://stackoverflow.com/a/23907166/6891712

I have tried using the below method which give only the call details but not able to find that from which sim the call is dialed or received

private void getCalldetailsNow() {

         @SuppressLint("MissingPermission") Cursor managedCursor=c.getContentResolver().query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DATE + " DESC");

        int number = 0;
        if (managedCursor != null) {
            number = managedCursor.getColumnIndex( CallLog.Calls.NUMBER );
        }
        int duration1 = managedCursor.getColumnIndex( CallLog.Calls.DURATION);
        int type1=managedCursor.getColumnIndex(CallLog.Calls.TYPE);
        int date1=managedCursor.getColumnIndex(CallLog.Calls.DATE);
        int idSimId = getSimIdColumn(managedCursor);

        if( managedCursor.moveToFirst() == true ) {
            String phNumber = managedCursor.getString(number);
            String callDuration = managedCursor.getString(duration1);

            String type=managedCursor.getString(type1);
            String date=managedCursor.getString(date1);
            String gettSimNumber=managedCursor.getString(idSimId);

            String dir = null;
            int dircode = Integer.parseInt(type);
            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;
            default: 
                dir = "MISSED";
                break;
            }       
        }

        managedCursor.close();
    }


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(" Simmmm", "sim_id column found: " + s);
                return id;
            }
        }
        Log.d(" Simmmm", "no sim_id column found");
        return -1;
    }
Phantômaxx
  • 37,901
  • 21
  • 84
  • 115
Kabilan
  • 191
  • 10
  • Here's my solution for this: https://stackoverflow.com/a/73769425/878126 , but sadly there are probably some devices that need query of other columns: https://stackoverflow.com/a/23907166/878126 . Maybe you could have multiple fallbacks. – android developer Sep 19 '22 at 10:35

2 Answers2

0

Try this method to read sim card contact ..

if you want to read first device store contact then implement to implements LoaderManager.LoaderCallbacks into class..

    @Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {

    return new CursorLoader(getActivity(),
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, ProfileQuery.PROJECTION,
            // Select only email addresses
            null, null, null);
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    List<String> numbers = new ArrayList<>();

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        String phoneNumber = cursor.getString(ProfileQuery.NUMBER).replaceAll("\\D", "");

        CustomLogHandler.printDebuglog(TAG, "onLoadFinished: " + phoneNumber);

        if (!TextUtils.isEmpty(phoneNumber) && !phoneNumber.startsWith(Constants.SP_COUNTRY_CODE)) {
            mCountryCodeList.add(new StringBuilder().append(Constants.SP_COUNTRY_CODE).toString());
            alPhoneNumbers.add(new StringBuilder().append(Constants.SP_COUNTRY_CODE).append(phoneNumber).toString());
        } else {
            mCountryCodeList.add(new StringBuilder().append(Constants.SP_COUNTRY_CODE).toString());
            alPhoneNumbers.add(phoneNumber);
        }
        names.add(cursor.getString(ProfileQuery.NAME));
        cursor.moveToNext();
    }
    allPhoneNumberName.addAll(names);
}

this below class read sim card data..

private class ReadContactFromSIMCard extends AsyncTask<Object, Object, Object> {

    @Override
    protected void onPostExecute(Object o) {
        super.onPostExecute(o);
        requestForContact();
    }

    @Override
    protected Object doInBackground(Object[] params) {

        Cursor cursorSim = null;
        try {
            String phoneNo;
            String name;
            Uri simUri = Uri.parse("content://icc/adn");
            cursorSim = getActivity().getContentResolver().query(simUri, null, null, null, null);

            if (cursorSim != null) {
                while (cursorSim.moveToNext()) {
                    name = cursorSim.getString(cursorSim.getColumnIndex("name"));
                    phoneNo = cursorSim.getString(cursorSim.getColumnIndex("number"));
                    if (!TextUtils.isEmpty(name)) {
                        allPhoneNumberName.add(name);
                    }
                    if (!TextUtils.isEmpty(phoneNo)) {
                        phoneNo.replaceAll("\\D", "");
                        phoneNo.replaceAll("&", "");

                        if (!TextUtils.isEmpty(phoneNo) && !phoneNo.startsWith(Constants.SP_COUNTRY_CODE)) {
                            mCountryCodeList.add(Constants.SP_COUNTRY_CODE);
                            alPhoneNumbers.add(Constants.SP_COUNTRY_CODE + phoneNo);
                        } else {
                            mCountryCodeList.add(Constants.SP_COUNTRY_CODE);
                            alPhoneNumbers.add(phoneNo);
                        }
                    }
                }
            }
        } catch (Throwable e) {
            CustomLogHandler.printErrorlog(e);
        } finally {
            if (cursorSim != null) {
                cursorSim.close();
            }
        }
        return null;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        getLoaderManager().initLoader(0, null, FindFriendsFragment.this);
    }
}

get call log details...

private void getCallDetails() {
    StringBuffer sb = new StringBuffer();
    Uri contacts = CallLog.Calls.CONTENT_URI;
    Cursor managedCursor = this.getContentResolver().query(contacts, null, null, null, null);
    int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
    int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
    int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
    int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
    sb.append("Call Details :");
    while (managedCursor.moveToNext()) {

        HashMap rowDataCall = new HashMap<String, String>();

        String phNumber = managedCursor.getString(number);
        String callType = managedCursor.getString(type);
        String callDate = managedCursor.getString(date);
        String callDayTime = new Date(Long.valueOf(callDate)).toString();
        // long timestamp = convertDateToTimestamp(callDayTime);
        String callDuration = managedCursor.getString(duration);
        String 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;
        }
        sb.append("\nPhone Number:--- " + phNumber + " \nCall Type:--- " + dir + " \nCall Date:--- " + callDayTime + " \nCall duration in sec :--- " + callDuration);
        sb.append("\n----------------------------------");
        Uri allCalls = Uri.parse("content://call_log/calls");
        Cursor c = managedQuery(allCalls, null, null, null, null);
        String id = c.getString(c.getColumnIndex(CallLog.Calls.PHONE_ACCOUNT_ID));
        Log.d("sim",id);


    }
    managedCursor.close();
    System.out.println(sb);
}

and i hope you add below permission into android manifest file ..

    <uses-permission android:name="android.permission.READ_CALL_LOG" />
  • thanks , but it's provide only internally saved default numbers like, name: Police number: 100 name: Fire number: 101 name: Ambulance number: 102 . But i need which sim make a call. kindly send other way – Kabilan May 04 '18 at 14:01
  • Yes.exactly but need with call logs For example duration, time and check call which sim to done – Kabilan May 04 '18 at 14:13
  • i provide one more method try that method. –  May 04 '18 at 14:21
  • thanks but this method also i used, it's only return which i have dialed and received numbers . – Kabilan May 04 '18 at 14:32
  • 1
    you want sim name or number, –  May 04 '18 at 14:36
  • Sim number or sim serial number or any other unique data between two sims – Kabilan May 04 '18 at 14:53
  • Read this refer link it provide answer https://stackoverflow.com/questions/14517338/android-check-whether-the-phone-is-dual-sim/17499889#17499889 –  May 05 '18 at 05:53
  • Thanks for your response , but i need which sim make a call and duration in 2 sim mobile , its one done in truecaller app. but i don't no correct way to get duration , date and which sim make a call – Kabilan May 06 '18 at 10:18
0

Maybe you can get subscription_id by get "Calls.PHONE_ACCOUNT_ID" item, which called "The identifier for the account used to place or receive the call."

And after you get the subscription_id, which is match slot id, for example, slot 0 is subscription_id 0, and slot id 1 is subscription_id 1, then you can getSlotIndex using giveb subid, then you can using this slotid to query calls from this slot or to this slot.

ppp wang
  • 32
  • 2
  • I used Calls.PHONE_ACCOUNT_ID but its return null value for some devices – Kabilan May 07 '18 at 07:04
  • Some devices may re_write data base, you can pull those database and to find releated item, some phone is Calls.PHONE_ACCOUNT, you can find this item first, and then using this item. – ppp wang May 08 '18 at 02:28
  • sure i will used Calls.PHONE_ACCOUNT and let you know . – Kabilan May 08 '18 at 05:58