web-dev-qa-db-fra.com

Insérer une nouvelle intention de contact

Pour l'une de mes applications, l'utilisateur doit sélectionner l'un de ses contacts existants ou en créer un nouveau. Il est clairement facile d'en choisir un avec le code suivant:

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

Maintenant, je veux créer un nouveau contact. J'ai essayé d'utiliser ce code mais cela ne déclenche pas le résultat de l'activité:

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

Le code ci-dessus démarrera le formulaire d'ajout de contact. Ensuite, lorsque je le valide, il me demande simplement d'ouvrir la liste de contacts et la méthode onActivityResult n'est jamais déclenchée.

Pourriez-vous m'aider à le faire fonctionner?

J'ai lu sur certains forums que cela n'était pas possible et j'ai dû créer mon propre formulaire d'ajout de contact. Pourriez-vous confirmer cela?

EDIT: Problème résolu. Vérifiez ma réponse.

18
Manitoba

Enfin trouvé une solution, je la partage avec vous. Ce n'est qu'un correctif pour la version Android supérieure à 4.0.3 et supérieure. Cela ne fonctionne pas sur 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);
16
Manitoba

Vous pouvez choisir d'ajouter le contact automatiquement ou d'ouvrir l'activité d'ajout de contact avec des données préremplies:

/**
 * 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();
}
43
Stefan de Bruijn
Intent intent = new Intent(
        ContactsContract.Intents.SHOW_OR_CREATE_CONTACT,
        Uri.parse("tel:" + phoneNumber));
    intent.putExtra(ContactsContract.Intents.EXTRA_FORCE_CREATE, true);
    startActivity(intent);

ce code pourrait vous aider.

8
Nirav Tukadiya
 // 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);

Si vous avez déjà des détails pour le contact, tels qu'un numéro de téléphone ou une adresse électronique, vous pouvez les insérer dans l'intention en tant que données étendues. Pour une valeur de clé, utilisez la constante appropriée de Intents.Insert. L'application Contacts affiche les données dans son écran d'insertion, ce qui permet aux utilisateurs d'effectuer d'autres modifications et ajouts.

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

Une fois l'intention créée, envoyez-la en appelant startActivity ().

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

Remarque: importer les "intentions" de "ContactsContract"

1
Amit Tumkur

Essayez si vous utilisez 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)
    }
}
0
Vitali

Utilisé la première partie de la réponse acceptée:

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

maintenant, sur votre résultat, vous pouvez obtenir le numéro de téléphone et le nom. Comme c'est très compliqué et que vous devriez interroger deux tables différentes qui sont connectées par le même identifiant. Je posterai cette partie afin que ce soit plus facile pour tout le monde:

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

J'espère que cela aidera quelqu'un.

0
steve moretz

Dans Xamarin.forms et 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);
0
M. Hamza Rajput
 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);     
                    }

    }
}
0
Vikalp Patel