2013-01-11 14 views
12

W przypadku jednej z moich aplikacji potrzebuję użytkownika do wybrania jednego z jego istniejących kontaktów lub utworzenia nowego. Picking jeden jest wyraźnie łatwo zrobić za pomocą następującego kodu:Wstaw nowe intencje kontaktu

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

Teraz chcę utworzyć nowy kontakt. Próbowałem użyć tego kodu, ale nie wywołuje ono wyniku działania:

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

Powyższy kod uruchomi formularz dodawania kontaktów. Następnie, gdy go sprawdzam, po prostu prosi mnie o otwarcie listy kontaktów, a metoda onActivityResult nigdy nie jest aktywowana.

Czy możesz mi pomóc, aby działało?

Czytałem na niektórych tablicach, że nie było to możliwe, i musiałem stworzyć własny formularz dodawania kontaktów. Czy możesz to potwierdzić?

EDYCJA: Problem rozwiązany. Sprawdź moją odpowiedź.

+0

spróbować dodać URI wraz z zamiarem działania 'I = new Intent (Intent.ACTION_INSERT, Contacts.CONTENT_URI);'. 'OnActivityResult(); zwróci URI nowo nawiązanego kontaktu. –

Odpowiedz

15

Wreszcie znalazł rozwiązanie, dzielę się nim z wami. To tylko poprawka dla wersji Androida powyżej 4.0.3 i sup. Nie działa w wersjach od 4.0 do 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

Czy kontrola wersji SDK jest naprawdę potrzebna? Zakładam, że starsze wersje zignorowałyby wszystko, czego nie rozumieją? –

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

ten kod może ci pomóc.

+0

Nie, to w ogóle nie działa. Dzięki i tak. – Manitoba

+0

Pracowałem dla mnie. Uruchamianie Api 21 – SysHex

35

Można wybrać, czy chcesz dodać kontakt automatycznie lub otworzyć działalność kontakt dodaj z ampułko-danych:

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

Dzięki, ale jak wywołać funkcję onActivityResult po utworzeniu kontaktu? – Manitoba

+2

Testowałem wiele odpowiedzi. ale ta odpowiedź, a szczególnie ta automatyczna, jest doskonała. wielkie dzięki. – ConductedClever

+0

nie odpowiada na pytanie. Problem polega na tym, że 'onActivityResult' nie nazywa się –

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

Dzięki. Już rozwiązałem mój problem, ponieważ kod, który mi dałeś działa doskonale na Androidzie <4.0, ale nie wyżej.Opublikowaliśmy tę sztuczkę, aby naprawić to jako odpowiedź. – 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); 

Jeśli masz już dane do kontaktu, takie jak numer telefonu lub adres e-mail, możesz wstawić je do intencji rozszerzonych danych. Dla wartości klucza użyj odpowiedniej stałej z Intents.Insert. Aplikacja kontaktów wyświetla dane na ekranie wstawiania, umożliwiając użytkownikom wprowadzanie dalszych zmian i dodatków.

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

Po utworzeniu intencji wyślij ją, wywołując funkcję startActivity().

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

Uwaga: "intencje" import "ContactsContract"