2013-01-11 9 views
12

私のアプリケーションの1つとして、ユーザーは既存のコンタクトを選択するか、新しいコンタクトを作成する必要があります。 ピッキング1は、次のコードを使用して行うことが明らかに簡単です:新しいコンタクトインテントを挿入する

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メソッドは決して引き起こされません。

それを機能させる手助けをしてもらえますか?

これは不可能であると私はいくつかのボードで読んで、フォームを追加して自分の連絡先を作成する必要がありました。それを確認できますか?

EDIT:問題を解決しました。私の答えをチェックしてください。

+0

はテントアクション '私は=新しいテント(Intent.ACTION_INSERT、Contacts.CONTENT_URI)と一緒に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); 

インテントを作成したら、startActivity()を呼び出して送信します。

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

注: "ContactsContract" のインポート "意図"

関連する問題