2013-01-11 17 views
12

Per una delle mie app, ho bisogno che l'utente selezioni uno dei suoi contatti esistenti o ne crei uno nuovo. Picking uno è chiaramente facile da fare con il seguente codice:Inserire un nuovo intento di contatto

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

Ora voglio creare un nuovo contatto. Ho cercato di usare quel codice, ma non fa scattare il risultato di attività:

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

Il codice di cui sopra avrà inizio il modulo di contatto aggiungendo. Quindi, quando lo convalido, mi chiede semplicemente di aprire l'elenco dei contatti e il metodo onActivityResult non viene mai attivato.

Potresti aiutarmi a farlo funzionare?

Ho letto su alcune schede che questo non era possibile e ho dovuto creare il mio modulo personale di aggiunta. Potresti confermarlo?

MODIFICA: problema risolto. Controlla la mia risposta.

+0

tenta di aggiungere URI con azione Intent 'i = new Intent (Intent.ACTION_INSERT, Contacts.CONTENT_URI);'. 'OnActivityResult();' restituirà l'URI di nuovo contatto. –

risposta

15

finalmente trovato una soluzione, sto condividendo con voi. Questa è solo una correzione per la versione Android sopra 4.0.3 e sup. Non funziona su 4.0 a 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

Il controllo della versione dell'SDK è davvero necessario? Supponevo che le versioni precedenti ignorassero tutto ciò che non capiscono? –

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

questo codice potrebbe aiutare.

+0

No, non funziona affatto. Grazie comunque. – Manitoba

+0

ha funzionato per me. Running Api 21 – SysHex

35

È possibile scegliere se si desidera aggiungere il contatto automaticamente, o aprire l'attività di contatto aggiuntivo con i dati pre-riempita:

/** 
* 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

Grazie, ma come attivare la funzione onActivityResult dopo la creazione del contatto? – Manitoba

+2

Ho testato molte risposte. ma questa risposta, specialmente quella automatizzata, è eccellente. molte grazie. – ConductedClever

+0

non risponde alla domanda. Il problema è che 'onActivityResult' non è chiamato –

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

Grazie. Ho già risolto il mio problema perché il codice che mi hai fornito funziona perfettamente su Android <4.0 ma non sopra.Ho pubblicato il trucco per risolverlo come risposta. – 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); 

Se si dispone già di dati per il contatto, come ad esempio un numero di telefono o indirizzo e-mail, è possibile inserire l'intento come dati estesi. Per un valore chiave, utilizzare la costante appropriata da Intents.Insert. L'app contatti visualizza i dati nella sua schermata di inserimento, consentendo agli utenti di apportare ulteriori modifiche e aggiunte.

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

Dopo aver creato l'intent, inviarlo chiamando startActivity().

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

Nota: importazione "intenti" di "ContactsContract"

Problemi correlati