Как получить журналы вызовов с двумя сим номерами? - PullRequest
0 голосов
/ 04 мая 2018

Как получить двойные сим номера звонков в Android. Я перешел по ссылке ниже, чтобы получить двойные журналы вызовов sim, но этот метод всегда возвращает -1. Я пробовал другой стек-поток не так много ответов для двух сим-журналов вызовов, который доступен из API 21. https://stackoverflow.com/a/23907166/6891712

Я пытался использовать метод ниже, который дает только детали вызова, но не смог найти тот, с которого сим был набран или получен вызов

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

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Возможно, вы можете получить subscription_id, получив элемент «Calls.PHONE_ACCOUNT_ID», который называется «Идентификатор учетной записи, используемой для совершения или приема вызова».

И после того, как вы получите subscription_id, который является идентификатором слота совпадения, например, слот 0 равен subscription_id 0, а слот ID 1 равен subscription_id 1, вы можете получить GetSlotIndex, используя subid giveb, затем вы можете использовать эту slotid для запроса вызовов из этого слота или в этот слот.

0 голосов
/ 04 мая 2018

Попробуйте этот способ прочитать контакт сим-карты ..

если вы хотите прочитать первый контакт хранилища устройств, а затем внедрить в , реализует LoaderManager.LoaderCallbacks в класс ..

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

это ниже класса читать данные сим-карты ..

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

получить данные журнала вызовов ...

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

и я надеюсь, что вы добавите ниже разрешение в файл манифеста Android ..

    <uses-permission android:name="android.permission.READ_CALL_LOG" />
...