以编程方式将组织和组织标题添加到新联系人

时间:2014-08-05 20:27:40

标签: android android-contacts

我正在尝试使用联系人API添加包含用户组织及其职位的联系信息。

我正在使用以下代码来执行插入操作。

 String contactName = xmlProcessor.getSingleParameterValue("ContactName");

            if (xmlProcessor.doesSingleElementExist("CompanyName")) {
                company = xmlProcessor.getSingleParameterValue("CompanyName");
            }
            if (xmlProcessor.doesSingleElementExist("CompanyTitle")) {
                companyTitle = xmlProcessor.getSingleParameterValue("CompanyTitle");
            }
            String phoneNumber = xmlProcessor.getSingleParameterValue("PhoneNumber");

            ContactInformation.PhoneNumberType phoneNumberType = ContactInformation.PhoneNumberType.valueOf(xmlProcessor.getSingleParameterValue("PhoneNumberType"));
            String email = xmlProcessor.getSingleParameterValue("Email");
            ContactInformation.EmailType emailType = ContactInformation.EmailType.valueOf(xmlProcessor.getSingleParameterValue("EmailType"));
            String address = xmlProcessor.getSingleParameterValue("Address");
            ContactInformation.AddressType addressType = ContactInformation.AddressType.valueOf(xmlProcessor.getSingleParameterValue("AddressType"));

            ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
            int rawContactID = ops.size();

            //Create the Raw ID
            ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
                .build());

            // Adding insert operation to operations list
            // to insert display name in the table ContactsContract.Data
            ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contactName)
                .build());

            if (company != null) {
                //Adding insert operation to operations list
                //to insert organisation name
                ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, company)
                        .build());
            }

            if (companyTitle != null) {
                //Adding insert operation to operations list
                //to inset organisation title
                ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.Organization.JOB_DESCRIPTION, companyTitle)
                        .build());
            }
            // Adding insert operation to operations list
            // to insert Mobile Number in the table ContactsContract.Data
            ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber)
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, getPhoneTypeInteger(phoneNumberType))
                .build());

            if (!email.equals("")) {
                // Adding insert operation to operations list
                // to insert Email
                ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                    .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                    .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
                    .withValue(ContactsContract.CommonDataKinds.Email.TYPE, getEmailTypeInteger(emailType))
                    .build());
            }
            if (!address.equals(""))
            {
                //Insert the address
                ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                        .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                        .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, address)
                        .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, getAddressTypeInteger(addressType))
                        .build());

            }

            context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

插入主要工作正常,组织名称似乎没问题但作业标题似乎没有引用正确的内容。我使用了Organisation.JOB_DESCRIPTION和Organisation.TITLE。

当我手动添加联系人的公司名称和职位时,当您进入查看联系人详细信息时,联系人姓名,公司和职位名称会显示在操作栏中。但是,当我通过上面的代码添加联系人时,我可以看到联系人姓名和他们的公司但不是他们的职位,所以我认为我必须将其添加到错误的地方。

澄清

在下面的屏幕截图中,它显示了我想从人员应用程序,名称,组织和标题中添加哪些信息。当这些第一个文本框中包含数据时,当您查看联系人时,此数据将显示在操作栏中。

What data I am trying to include

当我使用上面的代码通过我的应用程序添加联系人时,信息将放在名称的第一个文本框中,组织的第二个联系人,然后是作业标题的5个文本框,因此操作栏仅显示联系人姓名和组织。下面的截图显示了我的意思

What contact looks like after it has been added via my app

1 个答案:

答案 0 :(得分:0)

如下所示更改您的添加方法,它可以正常添加标题和公司名称。

ops.add(ContentProviderOperation.newInsert(Data.CONTENT_URI) 
                .withValueBackReference(Data.RAW_CONTACT_ID, 0) 
                .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, "Abc Corp")
                .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, "Developer")
                .build());