简体   繁体   English

Android插入联系人不显示姓名

[英]Android insert contact not showing name

I am trying to export contact from my application to the Android's default contact list. 我正在尝试将联系人从我的应用程序导出到Android的默认联系人列表。 I am using an intent to insert the contact details by launching the contact activity. 我打算通过启动联系人活动来插入联系人详细信息。 The contact activity pre-populate most of the intent data in the form, but It is not able to populate the name of the contact. 联系人活动以表格的形式预填充了大多数意图数据,但是无法填充联系人的姓名。 Here is my code for populating the intent data. 这是我用于填充意图数据的代码。

ArrayList<ContentValues> data = new ArrayList<>();

        if (!contactDetails.getName().isEmpty()) {
            ContentValues rowName = new ContentValues();
            rowName.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
            rowName.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contactDetails.getName());
            data.add(rowName);
        }
        if (!contactDetails.getCompany().isEmpty()) {
            ContentValues rowCompany = new ContentValues();
            rowCompany.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE);
            rowCompany.put(ContactsContract.CommonDataKinds.Organization.COMPANY, contactDetails.getCompany());
            data.add(rowCompany);

        }

        if (!contactDetails.getPhone().isEmpty()) {
            ContentValues rowPhone = new ContentValues();
            rowPhone.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
            rowPhone.put(ContactsContract.CommonDataKinds.Phone.NUMBER, contactDetails.getPhone());
            data.add(rowPhone);
        }

        ContentValues rowEmail = new ContentValues();
        rowEmail.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
        rowEmail.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_MOBILE);
        rowEmail.put(ContactsContract.CommonDataKinds.Email.LABEL, "Work");
        rowEmail.put(ContactsContract.CommonDataKinds.Email.ADDRESS, contactDetails.getEmail());
        data.add(rowEmail);

        Intent intent = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
        intent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, data);

        startActivity(intent);

Here is the screen shot. 这是屏幕截图。 Notice that the name field is empty, even when intent has the data. 请注意,即使意图包含数据,名称字段也为空。

联系人插入活动

I feel that I am not providing the right value for the following lines. 我觉得我没有为以下几行提供正确的值。

rowName.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
                rowName.put(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contactDetails.getName());

I tried the NickName field and it does work. 我尝试了NickName字段,它确实起作用。 example code. 示例代码。

if (!contactDetails.getName().isEmpty()) {
            ContentValues rowName = new ContentValues();
            rowName.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE);
            rowName.put(ContactsContract.CommonDataKinds.Nickname.NAME, contactDetails.getName());
            data.add(rowName);
        }

But not sure why it is not able to successfully display the name. 但不确定为什么它不能成功显示名称。 Am i missing something here? 我在这里想念什么吗?

Try this its working for me ,and let me inform if you are facing still any issue .Here there are five fields for user to insert data , you can modify this as per ur need. 尝试使用它为我工作,如果有任何问题,请告诉我。这里有五个字段供用户插入数据,您可以根据需要进行修改。

This is for adding new contact 这是用于添加新联系人

   // Creating a button click listener for the "Add Contact" button
    OnClickListener addClickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Getting reference to Name EditText 
            EditText etName = (EditText) findViewById(R.id.et_name);

            // Getting reference to Mobile EditText 
            EditText etMobile = (EditText) findViewById(R.id.et_mobile_phone);

            // Getting reference to HomePhone EditText 
            EditText etHomePhone = (EditText) findViewById(R.id.et_home_phone);

            // Getting reference to HomeEmail EditText 
            EditText etHomeEmail = (EditText) findViewById(R.id.et_home_email);

            // Getting reference to WorkEmail EditText 
            EditText etWorkEmail = (EditText) findViewById(R.id.et_work_email);             

            ArrayList<ContentProviderOperation> ops =
                      new ArrayList<ContentProviderOperation>();

            int rawContactID = ops.size();

            // Adding insert operation to operations list 
            // to insert a new raw contact in the table ContactsContract.RawContacts
            ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
                    .withValue(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, StructuredName.CONTENT_ITEM_TYPE)
                    .withValue(StructuredName.DISPLAY_NAME, etName.getText().toString())
                    .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, Phone.CONTENT_ITEM_TYPE)
                    .withValue(Phone.NUMBER, etMobile.getText().toString())
                    .withValue(Phone.TYPE, CommonDataKinds.Phone.TYPE_MOBILE)
                    .build());

            // Adding insert operation to operations list
            // to  insert Home Phone 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, Phone.CONTENT_ITEM_TYPE)
                    .withValue(Phone.NUMBER, etHomePhone.getText().toString())
                    .withValue(Phone.TYPE, Phone.TYPE_HOME)
                    .build());

            // Adding insert operation to operations list
            // to insert Home Email in the table ContactsContract.Data
            ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                    .withValue(ContactsContract.Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
                    .withValue(Email.ADDRESS, etHomeEmail.getText().toString())
                    .withValue(Email.TYPE, Email.TYPE_HOME)
                    .build());

            // Adding insert operation to operations list
            // to insert Work Email in the table ContactsContract.Data
            ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
                    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactID)
                    .withValue(ContactsContract.Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
                    .withValue(Email.ADDRESS, etWorkEmail.getText().toString())
                    .withValue(Email.TYPE, Email.TYPE_WORK)
                    .build());              

            try{
                // Executing all the insert operations as a single database transaction
                getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
                Toast.makeText(getBaseContext(), "Contact is successfully added", Toast.LENGTH_SHORT).show();
            }catch (RemoteException e) {                    
                e.printStackTrace();
            }catch (OperationApplicationException e) {
                e.printStackTrace();
            }
        }

This is for display contact list 这是用于显示联系人列表

OnClickListener contactsClickListener = new OnClickListener() {

        @Override
        public void onClick(View v) {
            // Creating an intent to open Android's Contacts List
            Intent contacts = new Intent(Intent.ACTION_VIEW,ContactsContract.Contacts.CONTENT_URI);

            // Starting the activity
            startActivity(contacts);                
        }
    };

This are the permissions you need to set in side Manifest 这是您需要在侧面清单中设置的权限

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

我通过在startActivity()方法调用之前添加以下行来解决此问题。

intent.putExtra(ContactsContract.Intents.Insert.NAME, contactDetails.getName());

You can use cursor to fetch contacts from device. 您可以使用光标从设备中获取联系人。

public void fetchContacts() {

    String phoneNumber = null;
    String email = null;

    Uri CONTENT_URI = ContactsContract.Contacts.CONTENT_URI;
    String _ID = ContactsContract.Contacts._ID;
    String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;
    String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;

    Uri PhoneCONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String Phone_CONTACT_ID = ContactsContract.CommonDataKinds.Phone.CONTACT_ID;
    String NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;

    Uri EmailCONTENT_URI =  ContactsContract.CommonDataKinds.Email.CONTENT_URI;
    String EmailCONTACT_ID = ContactsContract.CommonDataKinds.Email.CONTACT_ID;
    String DATA = ContactsContract.CommonDataKinds.Email.DATA;

    StringBuffer output = new StringBuffer();

    ContentResolver contentResolver = getContentResolver();

    Cursor cursor = contentResolver.query(CONTENT_URI, null,null, null, null);  

    // Loop for every contact in the phone
    if (cursor.getCount() > 0) {

        while (cursor.moveToNext()) {

            String contact_id = cursor.getString(cursor.getColumnIndex( _ID ));
            String name = cursor.getString(cursor.getColumnIndex( DISPLAY_NAME ));

            int hasPhoneNumber = Integer.parseInt(cursor.getString(cursor.getColumnIndex( HAS_PHONE_NUMBER )));

            if (hasPhoneNumber > 0) {

                output.append("\n First Name:" + name);

                // Query and loop for every phone number of the contact
                Cursor phoneCursor = contentResolver.query(PhoneCONTENT_URI, null, Phone_CONTACT_ID + " = ?", new String[] { contact_id }, null);

                while (phoneCursor.moveToNext()) {
                    phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(NUMBER));
                    output.append("\n Phone number:" + phoneNumber);

                }

                phoneCursor.close();

                // Query and loop for every email of the contact
                Cursor emailCursor = contentResolver.query(EmailCONTENT_URI,    null, EmailCONTACT_ID+ " = ?", new String[] { contact_id }, null);

                while (emailCursor.moveToNext()) {

                    email = emailCursor.getString(emailCursor.getColumnIndex(DATA));

                    output.append("\nEmail:" + email);

                }

                emailCursor.close();
            }

            output.append("\n");
        }

         System.out.println(output);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM