Как получить последние и любимые контакты в Android?

Я пытаюсь получить последние и избранные контакты, но каждый раз получаю сообщение об ошибке. я сохраняю контакты в базе данных после выборки.

не может прочитать столбец -1, и иногда он говорит, что курсор не инициализирован должным образом.

пожалуйста, помогите мне .

Вот мой код.

 ContentResolver cr = getActivity().getContentResolver();
  /*  Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
            null, null, null );*/


  Cursor cur=cr.query(CallLog.Calls.CONTENT_URI,null,CallLog.Calls.DATE, null,null);
    String phone = null;
    String emailContact = null;
    String image_uri;
    Bitmap bitmap;

    final SQLiteDatabase mDb = db.getWritableDatabase();
    mDb.beginTransaction();

    if (cur.getCount() > 0)
    {
        while (cur.moveToNext())
        {
            String id = cur.getString(cur
                    .getColumnIndex(ContactsContract.Contacts._ID));
            String name = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

            image_uri = cur
                    .getString(cur
                            .getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
            if (Integer
                    .parseInt(cur.getString(cur
                            .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                System.out.println("name : " + name + ", ID : " + id);

                Cursor pCur = cr.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                + " = ?", new String[]{id}, null);
                Log.e("pCur","dfgfdg  "+pCur.getCount());
                while (pCur.moveToNext())
                {
                    phone = pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    // contactid=pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));

                   /* phonenumber.add(pCur
                            .getString(pCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));`*/

                }
                pCur.close();


                Cursor emailCur = cr.query
                        (
                                ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                null,
                                ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                        + " = ?", new String[]{id}, null);

                while (emailCur.moveToNext())
                {
                    emailContact = emailCur
                            .getString(emailCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                    if(TextUtils.isEmpty(emailContact)||emailContact.equalsIgnoreCase(null)||emailContact.equalsIgnoreCase(""))
                    {
                        emailContact="";

                        Log.e("isEmpty","isEmpty " + emailContact);
                    }

                    else
                    {
                        Log.e("gfdszfg","Email " + emailContact);
                    }
                  /*  emailType = emailCur
                            .getString(emailCur
                                    .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));*/

                    Log.e("gfdszfg","Email " + emailContact);
                }
                emailCur.close();
            }

            if (image_uri != null)
            {
                System.out.println(Uri.parse(image_uri));
                try
                {
                    bitmap = MediaStore.Images.Media
                            .getBitmap(getActivity().getContentResolver(),
                                    Uri.parse(image_uri));
                    System.out.println(bitmap);

                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            mList.add(new Contacts(name, phone, image_uri,emailContact));

            ContentValues contentValues = new ContentValues();
            contentValues.put("contact_name", name);
            contentValues.put("contact_number",phone);
            contentValues.put("contact_email",emailContact);
            contentValues.put("contact_image",image_uri);
            mDb.insert(TABLE_CONTACT, null, contentValues);

            emailContact="";
            phone="";
        }
        mDb.setTransactionSuccessful();

        mDb.endTransaction();
        cur.close();
    }

person Prashant Jaiswal    schedule 01.05.2017    source источник


Ответы (2)


Вы запрашиваете таблицу CallLog:

Курсор cur=cr.query(CallLog.Calls.CONTENT_URI,null,CallLog.Calls.DATE, null,null)

а затем пытается получить информацию от этого курсора с полями из таблицы контактов:

cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));

Очевидно, это не так, как это должно работать.

Также на ваш выбор:

CallLog.Calls.DATE

не является допустимой строкой выбора.

Как это сделать:

Чтобы получить список помеченных (избранных) контактов:

String[] projection = new String[] { Contacts._ID }; // you can add more fields you need here
Cursor cursor = cr.query(Contacts.CONTENT_URI, projection, Contacts.STARRED + "=1", null, null);

Чтобы получить список контактов за последние 24 часа:

String[] projection = new String[] { Contacts._ID }; // you can add more fields you need here
int oneDay = (1000 * 60 * 60 * 24);
long last24h = (System.currentTimeMillis() - oneDay);
Cursor cursor = cr.query(Contacts.CONTENT_URI, projection, Contacts.    LAST_TIME_CONTACTED + ">" + last24h, null, null);
person marmor    schedule 01.05.2017
comment
код для получения контактов за последние 24 часа работает, но он показывает только мои сохраненные контакты, но не показывает новые набранные номера. - person Prashant Jaiswal; 01.05.2017
comment
когда я пытаюсь запустить код для избранных контактов, я получаю ошибку Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. - person Prashant Jaiswal; 01.05.2017
comment
col -1 означает, что вы пытаетесь получить доступ к полю, которого нет в проекции, вам нужно добавить поля, к которым вы хотите получить доступ, в массив проекции - person marmor; 01.05.2017
comment
опубликованный вами код также предполагал, что все номера в журнале вызовов являются контактами, поскольку он пытался получить контакты для каждого телефона. если вам просто нужны последние набранные номера, то это простой запрос к таблице журнала вызовов - person marmor; 01.05.2017
comment
так что я должен сделать, чтобы получить избранные контакты - person Prashant Jaiswal; 02.05.2017
comment
код в ответе должен извлекать все помеченные (избранные) контакты, если вы получаете ошибки col -1, просто добавьте поля в проекцию - person marmor; 03.05.2017

Я знаю, что до сих пор вы, возможно, исправили эту ошибку, но все же я хочу ответить за дальнейшую помощь искателям. Код для получения избранных контактов работает, вам просто нужно добавить следующее в проекцию:

String[] projection = new String[] { ContactsContract.Contacts._ID,
                    ContactsContract.Contacts.LOOKUP_KEY,
                    ContactsContract.Contacts.HAS_PHONE_NUMBER,
                    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY};
person Singh Shivandra    schedule 07.05.2021