Pregunta

Estoy tratando de recuperar el nombre del contacto, número de teléfono y dirección de la lista de contactos de Android. El nombre y el teléfono son bastante sencillo, pero la dirección parece no ser accesible con el nivel 1.6 API.

Alguien ha descubierto la manera de obtener la dirección de un contacto? También hay una nueva API en 2.0. ¿Cómo puedo tomar ventaja de esto y repliegue a la antigua API mediante el uso de 1 binario. Si eso es posible.

¿Fue útil?

Solución

Antes de Android 2.0 necesita consultar Contacts.ContactMethods.CONTENT_URI para obtener las direcciones postales que necesita para pasar

Contacts.ContactMethods.PERSON_ID + "=? and " + Contacts.ContactMethods.KIND + "=?"

para la selección y para el parámetro selectArgs:

new String[] { personId, Integer.toString(Contacts.KIND_POSTAL) }

A partir del 2.0 utiliza la nueva ContactsContract que es mucho más compleja debido a un contacto puede ahora la información agregada a través de un número de fuentes. Algunas buenas publicaciones del grupo en la nueva API son aquí y < a href = "http://groups.google.com/group/android-developers/browse_thread/thread/133816827efc8eb9" rel = "nofollow noreferrer"> aquí .

La forma recomendada para apuntar múltiples APIs de la plataforma del mismo binario es el uso de la reflexión (ver este entrada de blog ). He encontrado, aunque si orienta su aplicación en el 1,6 o por debajo en el manifiesto, pero establece la ruta de compilación para recoger el archivo jar 2.0 Android 2.0 puede llamar a las API sin la necesidad de reflexión. Sólo tiene que tener mucho cuidado de que las clases que están dependían de 2.0 clases no se cargan en un dispositivo de 1.6 o el cargador de clases tirarán. Para evitar esto se tendrá que utilizar algún tipo de fábrica para romper las dependencias (o un marco DI como Guice). Ver este publicación para otras discusiones.

Otros consejos

Gracias a Anthony Forloney ( continuación ) para el enlace a "cómo leer los contactos", que era útil. Para ampliar el contenido de la que vinculan , con el código de cómo leer "dirección", estas líneas deben ayudar! Deben buscar la dirección postal, como se ve, mediante la consulta utilizando el StructuredPostal contants.

            Cursor postals = getContentResolver().query(
                ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
                null,
                ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = "
                        + contactId, null, null);
        int postFormattedNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS);
        int postTypeNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE);
        int postStreetNdx = postals.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET);
        while (postals.moveToNext()) {
            String postalData = postals.getString(postFormattedNdx);
            postalCat = postalCat+ postalData+ ", [";
            postalData = String.valueOf(postals.getInt(postTypeNdx));
            postalCat = postalCat+ postalData+ "], ";
            postalData = postals.getString(postStreetNdx);
            postalCat = postalCat+ postalData+ " ";
        }
        postals.close();

El resto de que vinculan en efecto, buscar el el nombre y los teléfonos (cuando se corrige el "tiene el número de teléfono" error para el valor booleano - el booleano no consigue analiza correctamente)

En mi teléfono atm, pero aquí es un enlace con una pregunta similar a la suya.

Espero que esto ayude o que apunta en la dirección correcta.

EDIT:

Yo había mencionado, me gustaría editar mi respuesta original a por lo menos a lo que estaba buscando, este es probablemente malos finales y tiene su respuesta ya, pero aquí hay más información si todavía estuviera buscando un poco, lo que necesita a buscar es ContactsContract.CommonDataKinds.StructuredPostal se puede extraer detalles específicos con respecto a la dirección. En cuanto a un ejemplo usando Android 2.0 aquí muestra algunos ejemplos extraer la información de un contacto, es decir si no se ha dado cuenta ya.

Buena suerte.

así es como lo hice con Android 2.3.3:

            String where = ContactsContract.Data._ID + " = "
                                                     + uriData.getLastPathSegment()
                                                     + " AND ContactsContract.Data.MIMETYPE = '"
                                                     + ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE
                                                     + "'";

            String[] projection = new String[] { StructuredPostal.STREET,
                                                 StructuredPostal.CITY,
                                                 StructuredPostal.REGION,
                                                 StructuredPostal.POSTCODE,
                                                 StructuredPostal.COUNTRY};

            Cursor cursor = getContentResolver().query( ContactsContract.Data.CONTENT_URI,
                                                         projection,
                                                         where,
                                                         null,
                                                         null);
            String strOutput = "";
            if (cursor.moveToFirst())
            {
                strOutput += "\n" + cursor.getString(0);
                strOutput += "\n" + cursor.getString(1);
                strOutput += "\n" + cursor.getString(2);
                strOutput += "\n" + cursor.getString(3);
                strOutput += "\n" + cursor.getString(4);
            } 

            cursor.close();

Nota: el uriData se consigue mediante la captura de la intención de ver la dirección. Esto se soluciona aquí: Lo es la intención asociada con "Ver dirección de obra" en Contactos / Contacto Tarjeta?

En lugar de _ID, no dude en probar ContactsContract.Data.CONTACT_ID

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top