문제

Android 연락처 목록에서 연락처 이름, 전화 번호 및 주소를 검색하려고합니다. 이름과 전화는 매우 간단하지만 주소는 1.6 API 레벨로 액세스 할 수없는 것 같습니다.

누군가 연락처 주소를 얻는 방법을 알아 냈습니까? 또한 2.0에는 완전히 새로운 API가 있습니다. 1 바이너리를 사용하여이를 활용하고 이전 API 로의 폴백을 어떻게 활용할 수 있습니까? 가능하다면 가능하다면.

도움이 되었습니까?

해결책

Android 2.0 이전에 연락처를 쿼리해야합니다. ContactMethods.content_uri를 통과 해야하는 우편 주소를 얻으려면

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

선택 및 selectArgs 매개 변수의 경우 :

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

2.0 기준으로 연락처가 여러 소스에 걸쳐 정보를 집계 할 수 있기 때문에 훨씬 더 복잡한 새 ContactScontract를 사용합니다. 새로운 API에 대한 좋은 그룹 게시물이 있습니다 여기 그리고 여기.

동일한 바이너리에서 여러 플랫폼 API를 대상으로하는 권장 방법은 반사를 사용하는 것입니다 (이 참조 블로그 게시물). 앱을 매니페스트에서 1.6 이하로 타겟팅하는 경우, 빌드 경로를 설정하여 Android 2.0 Jar 파일을 선택하여 반사 할 필요없이 2.0 API를 호출 할 수 있습니다. 2.0 클래스에 의존하는 클래스가 1.6 장치에로드되지 않거나 클래스 로더가 던지지 않도록주의해야합니다. 이를 피하려면 의존성 (또는 Guice와 같은 DI 프레임 워크)을 깨뜨리려면 일종의 공장을 사용해야합니다. 이것 좀 봐 전기 추가 토론을 위해.

다른 팁

Anthony Forloney에게 감사합니다 (아래에) "연락처를 읽는 방법"에 대한 링크의 경우 유용했습니다. 내용을 확장합니다 그 링크 , "주소"를 읽는 방법의 코드와 함께이 줄은 도움이 될 것입니다! 그들은 당신이 볼 수 있듯이 우편 주소를 구조적 포스트 오염.

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

나머지 그 링크 실제로 이름과 전화를 가져 오는가 (부울 가치에 대한 "전화 번호가있는"실수를 수정할 때 부울은 제대로 구문 분석되지 않습니다)

내 전화 ATM에서 여기 귀하와 유사한 질문이있는 링크입니다.

이것이 올바른 방향으로 도움이되기를 바랍니다.

편집하다:

나는 당신이 찾고 있던 것에 대한 최소한 원래의 대답을 편집 할 것입니다. 이것은 아마도 늦었을 것입니다. 아마도 늦었을 것입니다. 그리고 당신은 이미 당신의 대답을 가지고 있지만 여기에 당신이 여전히 일부를 찾고 있다면 더 많은 정보가 있습니다. ~이다 ContactsContract.commondatakinds.StructuredPostal 주소에 관한 특정 세부 정보를 추출 할 수 있습니다. Android 2.0을 사용하는 예제 여기 연락처에서 정보를 추출하는 몇 가지 예를 보여줍니다.

행운을 빕니다.

이것이 내가 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();

노트: 그만큼 uriData 주소를 보려는 의도를 캡처함으로써 얻었습니다. 이것은 여기에 해결됩니다. 연락처 / 연락처 카드에서 "작업 주소보기"와 관련된 의도는 무엇입니까?

대신에 _ID, 자유롭게 시도하십시오 ContactsContract.Data.CONTACT_ID

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top