2013-01-11 51 views
12

對於我的一個應用程序,我需要用戶選擇他的一個現有聯繫人或創建一個新的聯繫人。 採摘一個顯然是容易用下面的代碼做:插入一個新的聯繫人意向

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方法。

你能幫我使它工作嗎?

我在某些電路板上看到這是不可能的,我必須創建自己的聯繫人添加表單。你能證實嗎?

編輯:問題解決了。檢查我的答案。

+0

嘗試與行動意圖沿增加URI的'I =新意圖(Intent.ACTION_INSERT,Contacts.CONTENT_URI);'。 'OnActivityResult();'將返回新聯繫人的URI。 –

回答

15

終於找到了解決辦法,我和你一起分享。 這只是針對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); 
+0

是否需要檢查SDK版本?我認爲舊版本會忽略任何他們不明白的東西? –

7
Intent intent = new Intent(
     ContactsContract.Intents.SHOW_OR_CREATE_CONTACT, 
     Uri.parse("tel:" + phoneNumber)); 
    intent.putExtra(ContactsContract.Intents.EXTRA_FORCE_CREATE, true); 
    startActivity(intent); 

此代碼可能會對您有所幫助。

+0

不,它根本不起作用。不管怎麼說,還是要謝謝你。 – Manitoba

+0

爲我工作。運行Api 21 – SysHex

35

您可以選擇是否要使用預填充數據自動添加的聯繫人,或打開添加聯繫人的活動:

/** 
* 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(); 
} 
+1

謝謝,但如何在聯繫人創建後觸發onActivityResult函數? – Manitoba

+2

我測試了很多答案。但這個答案,特別是自動化的是非常好的。非常感謝。 – ConductedClever

+0

它不回答問題。問題是'onActivityResult'不叫 –

0
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);  
        } 

    } 
} 
+1

謝謝。我已經解決了我的問題,因爲你給我的代碼在Android <4.0上完美工作,但不在上面。我發佈了這個技巧來解決這個問題。 – Manitoba

1
// 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」

相關問題