Pergunta

Eu estou tentando recuperar o nome do contato, número de telefone e endereço da lista de contatos android. O nome e telefone são bastante simples, mas o endereço parece não estar acessível com o nível de 1,6 api.

Tem alguém descobriu como obter o endereço de um contato? Também há um completamente novo api em 2,0. Como posso tirar proveito disso e fallback para o velho api usando um binário. Se isso é mesmo possível.

Foi útil?

Solução

Antes de Android 2.0 que você precisa para consulta Contacts.ContactMethods.CONTENT_URI para obter os endereços postais que você vai precisar passar

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

para a seleção e para o parâmetro selectArgs:

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

A partir de 2,0 você usar o novo ContactsContract que é muito mais complexa porque um contato pode informação agora agregada através de um número de fontes. Algumas postagens grupo bom sobre a nova API são aqui e < a href = "http://groups.google.com/group/android-developers/browse_thread/thread/133816827efc8eb9" rel = "nofollow noreferrer"> aqui .

A maneira recomendada para atingir múltiplas APIs de plataforma a partir do mesmo binário é usar a reflexão (ver este Blog Post ). Eu descobri que se você segmentar a sua aplicação em 1,6 ou abaixo no manifesto, mas definir o caminho de construção para pegar o arquivo jar 2,0 Android você pode chamar 2,0 apis sem a necessidade de reflexão. Você só precisa ter muito cuidado para que as classes que são dependiam 2,0 aulas não são carregados em um dispositivo 1.6 ou o carregador de classe vai jogar. Para evitar isso, você precisará usar algum tipo de fábrica para quebrar as dependências (ou um quadro DI como Guice). Veja este anúncio para futuras discussões.

Outras dicas

Graças à Anthony Forloney ( abaixo ) para o link to "Como ler contatos", que foi útil. Para estender o conteúdo do que apontam , com o código de como ler "endereço", estas linhas devem ajudar! Eles devem buscar o endereço postal, como você vê, por meio de consulta usando o 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();

O resto que apontam , de fato, buscar o nome e os telefones (quando você corrigir o "tem telefone" erro para o valor booleano - o boolean não ter analisado adequadamente)

No meu telefone atm, mas aqui é uma ligação com uma pergunta semelhante ao seu.

Espero que isso ajude ou pontos que você na direção certa.

EDIT:

Eu tinha mencionado, gostaria de editar a minha resposta original para, pelo menos para o que você está procurando, este é provavelmente mau tarde e você tem sua resposta já, mas aqui está mais informações se você ainda estivesse procurando alguma, o que você precisa é a olhar para ContactsContract.CommonDataKinds.StructuredPostal você pode extrair detalhes específicos sobre endereço. Como um exemplo para utilizar o Android 2,0 aqui mostra alguns exemplos extrair informações de um contato, isto é, se você ainda não percebi isso já.

Boa sorte.

este é como eu fiz isso com o 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: o uriData é obtido através da captura a intenção de ver o endereço. Isto é resolvido aqui: que é a intenção associada a "Ver endereço de trabalho" em Contatos / contato Card?

Em vez de _ID, sinta-se livre para tentar ContactsContract.Data.CONTACT_ID

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top