【问题标题】:Insert a new contact intent插入新的联系意图
【发布时间】:2012-12-26 01:26:42
【问题描述】:

对于我的一个应用,我需要用户选择他现有的联系人之一或创建一个新联系人。 使用以下代码显然很容易选择一个:

i = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
startActivityForResult(i, PICK_CONTACT_REQUEST );

现在我想创建一个新联系人。我尝试使用该代码,但它不会触发活动结果:

i = new Intent(Intent.ACTION_INSERT);
i.setType(Contacts.CONTENT_TYPE);
startActivityForResult(i, PICK_CONTACT_REQUEST);

以上代码将启动联系人添加表单。然后当我验证它时,它只是要求我打开联系人列表,并且永远不会触发 onActivityResult 方法。

你能帮我让它工作吗?

我在一些板上读到这是不可能的,我必须创建自己的联系人添加表单。你能确认一下吗?

编辑:问题已解决。检查我的答案。

【问题讨论】:

  • 尝试添加 URI 和 Intent Action i = new Intent(Intent.ACTION_INSERT,Contacts.CONTENT_URI);OnActivityResult(); 将返回新联系人的 URI。

标签: android contacts android-contacts


【解决方案1】:

您可以选择是否要自动添加联系人,或者使用预先填写的数据打开添加联系人活动:

/**
 * Open the add-contact screen with pre-filled info
 * 
 * @param context
 *            Activity context
 * @param person
 *            {@link Person} to add to contacts list
 */
public static void addAsContactConfirmed(final Context context, final Person person) {

    Intent intent = new Intent(Intent.ACTION_INSERT);
    intent.setType(ContactsContract.Contacts.CONTENT_TYPE);

    intent.putExtra(ContactsContract.Intents.Insert.NAME, person.name);
    intent.putExtra(ContactsContract.Intents.Insert.PHONE, person.mobile);
    intent.putExtra(ContactsContract.Intents.Insert.EMAIL, person.email);

    context.startActivity(intent);

}

/**
 * Automatically add a contact into someone's contacts list
 * 
 * @param context
 *            Activity context
 * @param person
 *            {@link Person} to add to contacts list
 */
public static void addAsContactAutomatic(final Context context, final Person person) {
    String displayName = person.name;
    String mobileNumber = person.mobile;
    String email = person.email;

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

    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());

    // Names
    if (displayName != null) {
        ops.add(ContentProviderOperation
                .newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
                        displayName).build());
    }

    // Mobile Number
    if (mobileNumber != null) {
        ops.add(ContentProviderOperation
                .newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, mobileNumber)
                .withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
                        ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE).build());
    }

    // Email
    if (email != null) {
        ops.add(ContentProviderOperation
                .newInsert(ContactsContract.Data.CONTENT_URI)
                .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
                .withValue(ContactsContract.CommonDataKinds.Email.TYPE,
                        ContactsContract.CommonDataKinds.Email.TYPE_WORK).build());
    }

    // Asking the Contact provider to create a new contact
    try {
        context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Toast.makeText(context, "Contact " + displayName + " added.", Toast.LENGTH_SHORT)
            .show();
}

【讨论】:

  • 谢谢,但是创建联系人后如何触发onActivityResult函数呢?
  • 我已经测试了很多答案。但是这个答案,特别是自动化的答案非常好。非常感谢。
  • 它没有回答这个问题。问题是onActivityResult没有被调用
【解决方案2】:

终于找到解决办法了,分享给大家。 这只是对 4.0.3 以上的 Android 版本的修复。它不适用于 4.0 到 4.0.2。

i = new Intent(Intent.ACTION_INSERT);
i.setType(Contacts.CONTENT_TYPE);
if (Integer.valueOf(Build.VERSION.SDK) > 14)
    i.putExtra("finishActivityOnSaveCompleted", true); // Fix for 4.0.3 +
startActivityForResult(i, PICK_CONTACT_REQUEST);

【讨论】:

  • 检查SDK版本真的有必要吗?我假设旧版本会忽略他们不理解的任何内容?
【解决方案3】:
Intent intent = new Intent(
        ContactsContract.Intents.SHOW_OR_CREATE_CONTACT,
        Uri.parse("tel:" + phoneNumber));
    intent.putExtra(ContactsContract.Intents.EXTRA_FORCE_CREATE, true);
    startActivity(intent);

此代码可能会对您有所帮助。

【讨论】:

  • 为我工作。运行 API 21
【解决方案4】:
 // Creates a new Intent to insert a contact

Intent intent = new Intent(Intents.Insert.ACTION);
 // Sets the MIME type to match the Contacts Provider

intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);

如果您已有联系人的详细信息,例如电话号码或电子邮件地址,您可以将它们作为扩展数据插入到意图中。对于键值,请使用 Intents.Insert 中的适当常量。联系人应用程序在其插入屏幕中显示数据,允许用户进行进一步的编辑和添加。

private EditText mEmailAddress = (EditText) findViewById(R.id.email);
private EditText mPhoneNumber = (EditText) findViewById(R.id.phone);

/*
 * Inserts new data into the Intent. This data is passed to the
 * contacts app's Insert screen
 */
 // Inserts an email address

 intent.putExtra(Intents.Insert.EMAIL, mEmailAddress.getText())
 /*
  * In this example, sets the email type to be a work email.
  * You can set other email types as necessary.
  */
  .putExtra(Intents.Insert.EMAIL_TYPE, CommonDataKinds.Email.TYPE_WORK)
 // Inserts a phone number
  .putExtra(Intents.Insert.PHONE, mPhoneNumber.getText())
 /*
  * In this example, sets the phone type to be a work phone.
  * You can set other phone types as necessary.
  */
  .putExtra(Intents.Insert.PHONE_TYPE, Phone.TYPE_WORK);

创建 Intent 后,通过调用 startActivity() 发送它。

/* Sends the Intent
 */
startActivity(intent);

注意:导入“ContactsContract”的“intents”

【讨论】:

    【解决方案5】:

    如果你使用 Kotlin 试试

    fun Fragment.saveContact(name: String?, phone: String?) {
        if (name != null && phone != null) {
            val addContactIntent = Intent(Intent.ACTION_INSERT)
            addContactIntent.type = ContactsContract.Contacts.CONTENT_TYPE
            addContactIntent.putExtra(ContactsContract.Intents.Insert.NAME, name)
            addContactIntent.putExtra(ContactsContract.Intents.Insert.PHONE, phone)
            startActivity(addContactIntent)
        }
    }
    

    【讨论】:

    • 点评来源: 您好,请不要只回答源代码。尝试对您的解决方案如何工作提供一个很好的描述。见:How do I write a good answer?。谢谢
    【解决方案6】:

    使用已接受答案的第一部分:

            Intent i = new Intent(Intent.ACTION_INSERT);
            i.setType(ContactsContract.Contacts.CONTENT_TYPE);
            if (Build.VERSION.SDK_INT > 14)
                i.putExtra("finishActivityOnSaveCompleted", true); // Fix for 4.0.3 +
            startActivityForResult(i, 1);
    

    现在在您的结果中,您可以获得电话号码和姓名,因为这很棘手,您应该查询两个由相同 id 连接的不同表。我将发布这部分,以便每个人都更容易:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if (requestCode == 1) {
            if (resultCode == RESULT_OK) {
                assert data != null;
                ContentResolver cr = getContentResolver();
                Cursor cursor = cr.query(Objects.requireNonNull(data.getData()), null, null, null, null);
                if (cursor != null && cursor.moveToFirst()) {
                    String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                    if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0) {//Has phoneNumber
                        Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
                        while (pCur != null && pCur.moveToNext()) {
                            String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            Log.v("SteveMoretz", "NAME : " + name + " phoneNo : " + phoneNo);
                        }
                        if (pCur != null) {
                            pCur.close();
                        }
                    }
                } else {
                    Toast.makeText(getApplicationContext(), "User canceled adding contacts", Toast.LENGTH_SHORT).show();
                }
                if (cursor != null) {
                    cursor.close();
                }
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
    

    希望这会对某人有所帮助。

    【讨论】:

      【解决方案7】:

      我收集了我找到的用于添加联系人的各种 Intent。这是单个函数的结果:

      @JvmStatic
      fun prepareCreateContactIntent(context: Context, contactName: String? = null, phoneNumber: String? = null): Intent? {
          var intent = Intent(Intents.Insert.ACTION)
          intent.type = ContactsContract.RawContacts.CONTENT_TYPE
          val packageManager = context.packageManager
          var resolveActivity: ResolveInfo? = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY or PackageManager.GET_RESOLVED_FILTER)
          if (resolveActivity == null) {
              intent = Intent(Intent.ACTION_INSERT).setType(ContactsContract.Contacts.CONTENT_TYPE)
              resolveActivity = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY or PackageManager.GET_RESOLVED_FILTER)
          }
          if (resolveActivity == null) {
              intent = Intent(Intents.SHOW_OR_CREATE_CONTACT, if (phoneNumber == null) Uri.parse("tel:") else Uri.parse("tel:$phoneNumber"))
              intent.putExtra(Intents.Insert.NAME, contactName)
              resolveActivity = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY or PackageManager.GET_RESOLVED_FILTER)
          }
          intent.putExtra(Intents.Insert.NAME, contactName)
          intent.putExtra(Intents.Insert.PHONE, phoneNumber)
          intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
          return if (resolveActivity == null) null else intent
      }
      

      如果返回null,说明没有app可以处理,所以你应该自己添加,或者给用户展示一些东西。

      【讨论】:

        【解决方案8】:
         int INSERT_CONTACT_REQUEST=2;
         i = new Intent(Intent.ACTION_INSERT,Contacts.CONTENT_URI);
         startActivityForResult(i, INSERT_CONTACT_REQUEST);
        

        protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        {
        // TODO Auto-generated method stub
         if(requestCode == INSERT_CONTACT_REQUEST)
           {
                if (resultCode == RESULT_OK)
                    {                                  
                     Toast.makeText().show(getApplicationContext(),"Added_Succesfully",Toast.LENGTH_SHORT);
                    }else if(resultCode == RESULT_CANCELED)
                           {
                         Toast.makeText().show(getApplicationContext(),"Contacts Adding Error",Toast.LENGTH_SHORT);     
                            }
        
            }
        }
        

        【讨论】:

        • 谢谢。我已经解决了我的问题,因为你给我的代码在 Android
        【解决方案9】:

        在 Xamarin.forms 和 Xamarin.Android c# 中。

        Android.Content.Intent intent = new  
        Android.Content.Intent(Android.Content.Intent.ActionInsert);
        intent.SetType(Android.Provider.ContactsContract.Contacts.ContentType);
        intent.PutExtra(Android.Provider.ContactsContract.Intents.ExtraForceCreate, 
        true);
        StartActivity(intent);
        

        【讨论】:

          猜你喜欢
          • 2019-10-28
          • 1970-01-01
          • 1970-01-01
          • 2014-12-28
          • 1970-01-01
          • 2016-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多