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.
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);
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();
}
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.
// 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"
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)
}
}
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.
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);
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);
}
}
}