2010-12-06 18 views
7

Obtuve la mayoría de las cosas cuando consulté los datos de contacto. Estoy peleando con StructuredName y Organization. No funcionan para miProblemas con ContactsContract.CommonDataKinds.StructuredName

Si no te importa, echa un vistazo al código. Está hecho a mano y se elimina una gran cantidad de errores de verificación para que sea lo más pequeño posible que se publicará aquí. Los comentarios con "no funcionan" son las partes que no funcionan para mí.

Los dos If() principales son parte del onActivityResult donde recibo los datos al final de la selección del contacto. La llamada se realiza con:

intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
startActivityForResult(intent, Main.DIALOG_PICKCONTACT); 

Muchas gracias de antemano HJW

if (requestCode == Main.DIALOG_PICKCONTACT) { 
if (resultCode == RESULT_OK) { 
    int i; 
    String s; 
    Cursor cursorContacts = managedQuery(intent.getData(), 
     null, 
     null, 
     null, 
     null); 
    if (cursorContacts != null) { 
    if (cursorContacts.moveToNext()) { 
    ContentResolver contentResolver = getContentResolver(); 
    String contactId = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts._ID)); 
    i = cursorContacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME); 
    // cursorContacts.getString(i); *** is DISPLAY_NAME 
    Cursor cursorEmail = contentResolver.query(
     ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
     new String[] { contactId }, 
     null); 
    if (cursorEmail != null) { 
    while (cursorEmail.moveToNext()) { 
     int type = cursorEmail.getInt(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
     s = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
     switch (type) { 
     case ContactsContract.CommonDataKinds.Email.TYPE_HOME: 
     // s *** is private Email 
     break; 
     case ContactsContract.CommonDataKinds.Email.TYPE_WORK: 
     // s *** is business Email 
     break; 
     } 
    } 
    cursorEmail.close(); 
    } 
    Cursor cursorOrganization = contentResolver.query(
     ContactsContract.Data.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Organization.CONTACT_ID + " = ?", 
     new String[] { contactId }, 
     null); 
    if (cursorOrganization != null) { 
    if (cursorOrganization.moveToNext()) { 
     s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA)); 
     // s *** Company name not working 
     s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE)); 
     // s *** Function within company not working 
    } 
    cursorOrganization.close(); 
    } 
    s = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
    if (Integer.parseInt(s) > 0) { 
    Cursor cursorPhone = contentResolver.query(
     ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", 
     new String[] { contactId }, 
     null); 
    if (cursorPhone != null) { 
     while (cursorPhone.moveToNext()) { 
     int type = cursorPhone.getInt(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)); 
     s = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
     switch (type) { 
     case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME: 
     // s *** is private fax 
     break; 
     case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK: 
     // s *** is business fax 
     break; 
     case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: 
     // s *** is private phone 
     break; 
     case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: 
     // s *** is mobile phone 
     break; 
     case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: 
     // s *** is business phone 
     break; 
     case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE: 
     // s *** is business mobile 
     break; 
     } 
     } 
     cursorPhone.close(); 
    } 
    } 
    Cursor cursorStructuredName = contentResolver.query(
     ContactsContract.Data.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = ?", 
     new String[] { contactId }, 
     null); 
    if (cursorStructuredName != null) { 
    if (cursorStructuredName.moveToNext()) { 
     i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); 
     // cursorStructuredName.getString(i); *** given name not working 
     i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME); 
     // cursorStructuredName.getString(i); *** middle name not working 
     i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX); 
     // cursorStructuredName.getString(i); *** prefix not working 
     i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX); 
     // cursorStructuredName.getString(i); *** suffix not working 
    } 
    cursorStructuredName.close(); 
    } 
    Cursor cursorStructuredPostal = contentResolver.query(
     ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = ?", 
     new String[] { contactId }, 
     null); 
    if (cursorStructuredPostal != null) { 
    while (cursorStructuredPostal.moveToNext()) { 
     int type = cursorStructuredPostal.getInt(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE)); 
     s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY)); 
     switch (type) { 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: 
     //s *** is private country 
     break; 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: 
     // s *** is business country 
     break; 
     } 
     s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY)); 
     switch (type) { 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: 
     // s *** is private city 
     break; 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: 
     // s *** is business city 
     break; 
     } 
     s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE)); 
     switch (type) { 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: 
     // s *** is private postcode 
     break; 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: 
     // s *** is business postcode 
     break; 
     } 
     s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET)); 
     switch (type) { 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME: 
     // s *** is private street 
     break; 
     case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK: 
     // s *** is business street 
     break; 
     } 
    } 
    cursorStructuredPostal.close(); 
    } 
    Cursor cursorWebsite = contentResolver.query(
     ContactsContract.Data.CONTENT_URI, 
     null, 
     ContactsContract.CommonDataKinds.Website.CONTACT_ID + " = ?", 
     new String[] { contactId }, 
     null); 
    if (cursorWebsite != null) { 
    while (cursorWebsite.moveToNext()) { 
     i = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL); 
     int type = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE); 
     s = cursorWebsite.getString(i); 
     switch (type) { 
     case ContactsContract.CommonDataKinds.Website.TYPE_HOME: 
     // s *** private url not working 
     break; 
     case ContactsContract.CommonDataKinds.Website.TYPE_WORK: 
     // s *** business url not working 
     break; 
     } 
    } 
    cursorWebsite.close(); 
    } 
    } 
    cursorContacts.close(); 
    } 
} 
} 
+0

Hola, Buen trabajo .. ¿Tienes la solución para obtener datos de la Organización? Gracias por adelantado. –

Respuesta

13

Su donde la condición es erróneo.

uso de este StructuredName:

// projection 
    String[] projection = new String[] {ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME}; 


    String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] whereParameters = new String[]{this.contact_id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE}; 

    //Request 
    Cursor contacts = this.resolver.query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null); 

    //Iteration 
    if (contacts.moveToFirst()) { 
     //code here 
    } 
    contacts.close(); 
+0

Perdón por esta respuesta tardía. No funcionó durante semanas, así que renuncié a eso. Con su ayuda investigué más y con muchos cambios e intentos logré que la mayoría trabajara (no el sitio web). Muchas gracias. Sin embargo, debe haber algo mal. Hay varios alias faltantes: ContactsContract.CommonDataKinds.StructuredName.CONTENT_URI y ContactsContract.CommonDataKinds.Website.CONTENT_URI, por ejemplo. Este alias existe para todos los demás: ContactsContract.CommonDataKinds.Email.CONTENT_URI o ContactsContract.CommonDataKinds.Phone.CONTENT_URI, por solo mencionar dos. –

+0

¡Ingenioso! Si pudiera, podría haberte subido dos veces, ¡tú resuelves mi problema de lucha de 1 hora! –

+0

Esto me ayudó a solucionar mi problema donde los nombres de familia/dados eran 1/nulo respectivamente. La clave para mí fue la cláusula WHERE que debe incluir AND "+ ContactsContract.Data.MIMETYPE +" =? o no obtiene la fila correcta y me da datos incorrectos. –

2
private String getWebsite(String contactId) 
{ 
    String[] cols = { ContactsContract.CommonDataKinds.Website.URL }; 
    String filter = ContactsContract.Data.CONTACT_ID+" = ? " + 
        " and "+ContactsContract.Data.MIMETYPE 
          +" = '"+ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE+"'"; 
    String[] params = { String.valueOf(contactId) }; 
    Cursor website = act.managedQuery(ContactsContract.Data.CONTENT_URI, cols, filter, params, null); 

    while (website.moveToNext()) { 
     String val = website.getString(website.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL)); 
     if (!StringUtils.isEmpty(val)) { 
      return val; 
     } 
    } 
    return null; 
} 

// abb2yb: enlightenmentnow

3

No se pudo encontrar solución completa como llegar primero, último, el segundo nombre y fecha de nacimiento de una persona recogidos a partir de contactos. Así que aquí está mi solución:

Mostrar lista A Contactos:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); 
startActivityForResult(intent, GET_PHONE_ADDRESS_BOOK_CONST); 

recoger un contacto:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (resultCode == Activity.RESULT_OK) { 
     switch (requestCode) { 

     case GET_PHONE_ADDRESS_BOOK_CONST: 
      getContactFromAddressBook(data); 
      break; 


     default: 
      break; 
     } 
    } 
    super.onActivityResult(requestCode, resultCode, data); 
} 

ID Cómo de contacto:

private void getContactFromAddressBook(Intent data) { 

    if (data != null) { 
     Uri uri = data.getData(); 
     if (uri != null) { 
      Cursor c = null; 
      try {    
       c = getActivity().getContentResolver().query(uri, 
         null, null, null, null); 

       if (c != null && c.moveToFirst()) { 
        String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID)); 
        getFullName(id); 
        getBirthday(id); 
       } 
      } 
      catch(Exception e) { 
       Utils.Loge(e.getMessage(), e); 
      } 
      finally { 
       if (c != null) { 
        c.close(); 
       } 
      } 
     } 
    } 
} 

Get primero, último y segundo nombre

private HashMap<String, String> getFullName(String id) 
{ 
    HashMap<String, String> ret = new HashMap<String, String>(); 

    String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
    String[] whereNameParams = new String[] { id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE }; 
    Cursor c = null; 
    try { 
     c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null); 
     if (c != null && c.moveToFirst()) { 
      int indexGivenName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME); 
      int indexFamilyName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME); 
      int indexDisplayName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME);  

      ret.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, c.getString(indexGivenName)); 
      ret.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, c.getString(indexFamilyName)); 
      ret.put(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, c.getString(indexDisplayName)); 
     } 
    } 
    catch(Exception e) { 
     Utils.Loge(e.getMessage(), e); 
    } 
    finally { 
     if (c != null) { 
      c.close(); 
     } 
    } 
    return ret; 
} 

Obtener cumpleaños

private Date getBirthday(String id) 
{ 
    Date date = null; 

    String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.Event.TYPE + " = ?"; 
    String[] whereNameParams = new String[] { id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) }; 
    Cursor c = null; 
    try { 
     c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null); 
     if (c != null && c.moveToFirst()) { 
      int indexBirthday = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Event.START_DATE); 
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.US); 
      date = format.parse(c.getString(indexBirthday)); 
     } 
    } 
    catch(Exception e) { 
     Utils.Loge(e.getMessage(), e); 
    } 
    finally { 
     if (c != null) { 
      c.close(); 
     } 
    } 
    return date; 
}