【问题标题】:cant get contacts data from htc(4.3.1) android无法从 htc(4.3.1) android 获取联系人数据
【发布时间】:2016-09-28 11:16:51
【问题描述】:

我无法为以下问题找到任何合适的解决方案。我有一些方法可以从电话返回联系人姓名和电话号码,它适用于许多设备。

但是,问题是这种方法不适用于我的 htc(android 4.3.1)。我认为,可能主要原因是在光标声明行上(Cursor phone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);),因为我通过 getCount 方法检查了 Cursor 对象,它显示为零,这意味着它无法获取任何数据。我尝试了很多方法来声明 Cursor 对象,但都没有成功。

提前致谢!请检查下面提到的代码:

private List<String> getContactNames() {
        List<String> contacts = new ArrayList<>();
        // Get the ContentResolver
        ContentResolver cr = getContentResolver();
        // Get the Cursor of all the contacts
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        while (phones.moveToNext()) {
            String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            phoneNumber = phoneNumber.replaceAll("[()+]", "");
            phoneNumber = phoneNumber.replaceAll(" ", "");
            if (phoneNumber.startsWith("8")) {
                phoneNumber = phoneNumber.replaceFirst("8", "7");
            }
            //contactNames.add(phoneNumber);
            contacts.add(name + "&&" + phoneNumber);
        }
        phones.close();
        Collections.sort(contacts, String.CASE_INSENSITIVE_ORDER);
        List<String> contactList =
                new ArrayList<>(new LinkedHashSet<String>(contacts));
        for (int i = 0; i < contactList.size(); i++) {
            String tem = contactList.get(i);
            String[] arr = tem.split("&&");
            contactNumbers.add(arr[1]);
            contactNames.add(arr[0]);
        }

        //Toast.makeText(this, contactNames.toString(), Toast.LENGTH_LONG).show();
        return contactList;
    }

【问题讨论】:

    标签: android


    【解决方案1】:

    使用这个。

    public class ContactsProvider {
    
    private Uri QUERY_URI = ContactsContract.Contacts.CONTENT_URI;
    private String CONTACT_ID = ContactsContract.Contacts._ID;
    private String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
    private Uri EMAIL_CONTENT_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
    private String EMAIL_CONTACT_ID = ContactsContract.CommonDataKinds.Email.CONTACT_ID;
    private String EMAIL_DATA = ContactsContract.CommonDataKinds.Email.DATA;
    private String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;
    private String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;
    private Uri PHONE_CONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    private String PHONE_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
    private String STARRED_CONTACT = ContactsContract.Contacts.STARRED;
    private ContentResolver contentResolver;
    
    public ContactsProvider() {
        contentResolver = GenericApplication.getContext().getContentResolver();
    }
    
    public List<Contact> getContacts() {
        List<Contact> contactList = new ArrayList<Contact>();
        String[] projection = new String[]{CONTACT_ID, DISPLAY_NAME, HAS_PHONE_NUMBER, STARRED_CONTACT};
        String selection = null;
        Cursor cursor = contentResolver.query(QUERY_URI, projection, selection, null, null);
    
        while (cursor.moveToNext()) {
            Contact contact = getContact(cursor);
            contactList.add(contact);
        }
    
        cursor.close();
        return contactList;
    }
    
    private Contact getContact(Cursor cursor) {
        String contactId = cursor.getString(cursor.getColumnIndex(CONTACT_ID));
        String name = (cursor.getString(cursor.getColumnIndex(DISPLAY_NAME)));
        Uri uri = Uri.withAppendedPath(QUERY_URI, String.valueOf(contactId));
    
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setData(uri);
        String intentUriString = intent.toUri(0);
    
        Contact contact = new Contact();
        contact.id = Integer.valueOf(contactId);
        contact.name = name;
        contact.uriString = intentUriString;
    
        getPhone(cursor, contactId, contact);
        getEmail(contactId, contact);
        return contact;
    }
    
    private void getEmail(String contactId, Contact contact) {
        Cursor emailCursor = contentResolver.query(EMAIL_CONTENT_URI, null, EMAIL_CONTACT_ID + " = ?", new String[]{contactId}, null);
        while (emailCursor.moveToNext()) {
            String email = emailCursor.getString(emailCursor.getColumnIndex(EMAIL_DATA));
            if (!TextUtils.isEmpty(email)) {
                contact.email = email;
            }
        }
        emailCursor.close();
    }
    
    private void getPhone(Cursor cursor, String contactId, Contact contact) {
        int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex(HAS_PHONE_NUMBER)));
        if (hasPhoneNumber > 0) {
            Cursor phoneCursor = contentResolver.query(PHONE_CONTENT_URI, null, PHONE_CONTACT_ID + " = ?", new String[]{contactId}, null);
            while (phoneCursor.moveToNext()) {
                String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(PHONE_NUMBER));
                contact.phone = phoneNumber;
            }
            phoneCursor.close();
        }
    }
    

    }

    【讨论】:

    • 你是否在清单中添加了这个?
    • 是的,我补充了,没有错误,我通过getCount()方法检查了游标对象,它等于零,这意味着它无法提取联系人数据,因为我之前很伤心方法也可以,除了我的htc手机,手机有很多联系人。
    • 好的,由于接触很多,您遇到了问题。
    • 我认为问题不在于联系人的数量,问题与 htc 相关,它不会提取联系人的任何数据。我的方法适用于 nexus、lenovo、samsung 等,除了 htc
    • 可能取决于设备的 CPU 结构。
    【解决方案2】:

    使用这个方法:

        private void LoadContactsWithPhone() {
        TextView contactView = (TextView) getView().findViewById(R.id.txtContacts);
        contactView.setText("");
    
        Cursor cursor = getContactsWithPhone();
    
        while (cursor.moveToNext()) {
    
            String displayName = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
    
            String phoneNo = cursor.getString(cursor
                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
    
            contactView.append("Name: ");
            contactView.append(displayName);
            contactView.append("\n");
    
            contactView.append("Phone: ");
            contactView.append(phoneNo);
            contactView.append("\n\n");
    
        }
    
    }
        private Cursor getContactsWithPhone() {
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] projection = new String[]{ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.NUMBER
        };
    
        String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?";
    
        String[] selectionArgs = new String[]{String.valueOf(1)};
    
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
    
        return getActivity().getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
    }
    

    【讨论】:

    • 您能否也显示 getContactsWithPhone() 方法,此处显示(在您的代码中)?
    【解决方案3】:

    对不起各位,主要原因是设备本身,我检查了其他使用设备联系人作为whatsapp的类似应用程序,这些应用程序也无法使用手机的联系人。此处提供的所有答案都完美无缺,与我的方法一样好。

    【讨论】:

    • 这是否意味着您仍然无法读取 HTC 上的联系人?我在 HTC 10 上发现了同样的问题,但我无法在该特定设备上解决问题。
    • @PKuijpers ,是的,这是特定设备的故障,所以我放弃了在那部手机上测试应用程序。
    【解决方案4】:

    请在所有设备上使用以下代码:-

      public ArrayList<Contact_Model> getContacts(){
    
        ArrayList<Contact_Model> contact_models = new ArrayList<>();
        //        ContentResolver cr = context.getActivity().getContentResolver();
                ContentProviderClient mCProviderClient = context.getActivity().getContentResolver().acquireContentProviderClient(ContactsContract.Contacts.CONTENT_URI);
                Cursor cur = mCProviderClient.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    
                if (cur.getCount() > 0) {
                    while (cur.moveToNext()) {
                        Contact_Model contact_model = new Contact_Model();
                        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                        String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                        String firstname;
                        String lastName = "";
                        if (name != null) {
    
                            contact_model.setContactId(id);
                            contact_model.setContactName(name);
                            if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                                // get the phone number
                                Cursor pCur = mCProviderClient.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                                        ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                                        new String[]{id}, null);
    
                                while (pCur.moveToNext()) {
                                    String phone = pCur.getString(
                                            pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                    contact_model.setContactNumber(phone);
                                }
                                pCur.close();
    
    
                                // get email and type
    
                                Cursor emailCur = mCProviderClient.query(
                                        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                        null,
                                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                                        new String[]{id}, null);
    
                                while (emailCur.moveToNext()) {
                                    // This would allow you get several email addresses
                                    // if the email addresses were stored in an array
                                    String email = emailCur.getString(
                                            emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                                    contact_model.setContactEmail(email);
                                }
                                emailCur.close();
    
                                Cursor photoCursor = mCProviderClient.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
                                        new String[]{id}, null);
                                while (photoCursor.moveToNext()) {
                                    String photo = photoCursor.getString(photoCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
                                    if (photo == null) {
                                        contact_model.setContactPhoto("");
                                    } else {
                                        contact_model.setContactPhoto(photo);
                                    }
    
                                }
                                contact_model.setContactOtherDetails("");
                                photoCursor.close();
    
                                // Get note.......
                                String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                                String[] noteWhereParams = new String[]{id,
                                        ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
                                Cursor noteCur = mCProviderClient.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null);
                                if (noteCur.moveToFirst()) {
                                    String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
                                    System.out.println("Note " + note);
                                    contact_model.setNote(note);
                                }
    
                                noteCur.close();
    
                                // Get Organizations.........
    
                                String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                                String[] orgWhereParams = new String[]{id,
                                        ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};
                                Cursor orgCur = mCProviderClient.query(ContactsContract.Data.CONTENT_URI,
                                        null, orgWhere, orgWhereParams, null);
                                if (orgCur.moveToFirst()) {
                                    String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
                                    String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
                                    if (orgName != null) {
                                        contact_model.setOrganization(orgName);
                                    }
                                    if (title != null) {
                                        contact_model.setJob(title);
                                    }
                                }
                                orgCur.close();
    
                            }
    
                            contact_models.add(contact_model);
                        }
                    }
                }
                return contact_models;
    
        }
    
    
    
    Contact Model:-
    
    public class Contact_Model implements Serializable {
    
        private String contactId = "", contactName = "", contactNumber = "", contactEmail = "", contactPhoto = "", contactOtherDetails = "";
    
        private String firstName = "", lastName = "", note = "", organization = "", job = "", dob = "";
    
        ContactAccount contactAccount;
    
        public Contact_Model() {
    
        }
    
    
    
        public Contact_Model(String contactId, String contactName, String contactNumber, String contactEmail, String contactPhoto, String contactOtherDetails, String firstName, String lastName,
                             String note, String organization, String job, String dob) {
            this.contactId = contactId;
            this.contactName = contactName;
            this.contactNumber = contactNumber;
            this.contactEmail = contactEmail;
            this.contactPhoto = contactPhoto;
            this.contactOtherDetails = contactOtherDetails;
            this.firstName = firstName;
            this.lastName = lastName;
            this.note = note;
            this.organization = organization;
            this.dob = dob;
            this.job = job;
        }
    
        public ContactAccount getContactAccount() {
            return contactAccount;
        }
    
        public void setContactAccount(ContactAccount contactAccount) {
            this.contactAccount = contactAccount;
        }
    
        public String getDob() {
            return dob;
        }
    
        public void setDob(String dob) {
            this.dob = dob;
        }
    
        public String getNote() {
            return note;
        }
    
        public void setNote(String note) {
            this.note = note;
        }
    
        public String getOrganization() {
            return organization;
        }
    
        public void setOrganization(String organization) {
            this.organization = organization;
        }
    
        public String getJob() {
            return job;
        }
    
        public void setJob(String job) {
            this.job = job;
        }
    
        public String getFirstName() {
            return firstName;
        }
    
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
    
        public String getLastName() {
            return lastName;
        }
    
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    
        public String getContactId() {
            return contactId;
        }
    
        public void setContactId(String contactId) {
            this.contactId = contactId;
        }
    
        public String getContactName() {
            return contactName;
        }
    
        public void setContactName(String contactName) {
            this.contactName = contactName;
        }
    
        public String getContactNumber() {
            return contactNumber;
        }
    
        public void setContactNumber(String contactNumber) {
            this.contactNumber = contactNumber;
        }
    
        public String getContactEmail() {
            return contactEmail;
        }
    
        public void setContactEmail(String contactEmail) {
            this.contactEmail = contactEmail;
        }
    
        public String getContactPhoto() {
            return contactPhoto;
        }
    
        public void setContactPhoto(String contactPhoto) {
            this.contactPhoto = contactPhoto;
        }
    
        public String getContactOtherDetails() {
            return contactOtherDetails;
        }
    
        public void setContactOtherDetails(String contactOtherDetails) {
            this.contactOtherDetails = contactOtherDetails;
        }
    }
    
    
    ContactAccount.class
    
    public class ContactAccount implements Serializable {
    
        String accountName = "", accountType = "";
    
        public ContactAccount(){
    
        }
    
        public ContactAccount(String accountName, String accountType) {
            this.accountName = accountName;
            this.accountType = accountType;
        }
    
    
        public String getAccountName() {
            return accountName;
        }
    
        public void setAccountName(String accountName) {
            this.accountName = accountName;
        }
    
        public String getAccountType() {
            return accountType;
        }
    
        public void setAccountType(String accountType) {
            this.accountType = accountType;
        }
    }
    

    希望对你有所帮助..

    【讨论】:

    • ,请您解释一下,Contact_Model 是什么?
    • 我不知道为什么,但是这段代码也无法从我的 htc(4.3.1) 中提取联系人,有什么想法吗?
    • 我正在编辑我的答案,请检查联系人模型和联系人帐户类。 @贝克
    • 非常感谢您的回想,问题出在设备上,而不是代码上,这里发布的所有答案都可以正常工作(包括您的),所以我不能只接受 1 个答案,因为所有答案都是正确的:)
    猜你喜欢
    • 2023-04-05
    • 2015-05-23
    • 1970-01-01
    • 2013-12-16
    • 2011-11-13
    • 1970-01-01
    • 2016-10-08
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多