Вставить новое намерение контакта
Для одного из моих приложений мне нужен пользователь, чтобы выбрать один из его существующих контактов или создать новый.
Выбор одного из них явно прост в использовании следующего кода:
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: проблема решена. Проверьте мой ответ.
Ответы
Ответ 1
Наконец нашел решение, я поделился им с вами.
Это только исправление для Android версии 4.0.3 и sup. Он не работает с 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);
Ответ 2
Вы можете выбрать, хотите ли вы автоматически добавлять контакт или открыть операцию добавления контактов с предварительно заполненными данными:
/**
* 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 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();
}
Ответ 3
Intent intent = new Intent(
ContactsContract.Intents.SHOW_OR_CREATE_CONTACT,
Uri.parse("tel:" + phoneNumber));
intent.putExtra(ContactsContract.Intents.EXTRA_FORCE_CREATE, true);
startActivity(intent);
этот код может вам помочь.
Ответ 4
Попробуйте, если вы используете 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)
}
}
Ответ 5
// 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 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"
Ответ 6
Использовал первую часть из принятого ответа:
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);
Теперь по вашему результату вы можете получить номер телефона и имя, так как это было сложно, и вы должны запросить две разные таблицы, которые связаны одинаковыми идентификаторами. Я опубликую эту часть, чтобы всем было проще:
@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);
}
Надеюсь, это кому-нибудь поможет.
Ответ 7
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);
}
}
}
Ответ 8
В Xamarin.forms и Xamarin.Android С#.
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);
Ответ 9
Intent intent = new Intent(ContactsContract.Intents.Insert.ACTION);
intent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
startActivityForResult(intent, requestCode);
Ответ 10
Я собрал все виды Intents, которые я нашел для добавления контакта. Вот результат в одной функции:
@JvmStatic
fun prepareCreateContactIntent(context: Context, contactName: String? = null, phoneNumber: String? = null): Intent? {
var intent = Intent(Intents.Insert.ACTION)
intent.type = ContactsContract.RawContacts.CONTENT_TYPE
val packageManager = context.packageManager
var resolveActivity: ResolveInfo? = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY or PackageManager.GET_RESOLVED_FILTER)
if (resolveActivity == null) {
intent = Intent(Intent.ACTION_INSERT).setType(ContactsContract.Contacts.CONTENT_TYPE)
resolveActivity = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY or PackageManager.GET_RESOLVED_FILTER)
}
if (resolveActivity == null) {
intent = Intent(Intents.SHOW_OR_CREATE_CONTACT, if (phoneNumber == null) Uri.parse("tel:") else Uri.parse("tel:$phoneNumber"))
intent.putExtra(Intents.Insert.NAME, contactName)
resolveActivity = packageManager.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY or PackageManager.GET_RESOLVED_FILTER)
}
intent.putExtra(Intents.Insert.NAME, contactName)
intent.putExtra(Intents.Insert.PHONE, phoneNumber)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET or Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
return if (resolveActivity == null) null else intent
}
Если он возвращает значение NULL, это означает, что не существует приложения, которое может его обработать, поэтому вы должны добавить его самостоятельно или показать что-то пользователю.