2012-06-25 5 views
1

연락처에서 연락처를 가져 오는 연락처 선택기가 있고 sharedPreferences에 여러 비트의 정보가 저장되어 있습니다. 공유 환경 설정에서 데이터를 보유하기 위해 조회 키를 사용하고 있습니다 (안드로이드 문서가 제안하는 것처럼)android에서 연락처 저장 및 검색

이 부분은 모두 괜찮아 보입니다. 조회 키를 얻고 저장합니다.

내 문제는 그때 조회 키를 통해 연락처를 찾는 연락처를 가져 오는에 와서 갔다하는 것은 때때로 null를 돌려 것으로 보인다

다음 세부 사항 접촉 선택기에서 온

Contact lookup key from the contact picker: 850i%2bw7vj56otre6eqa9b9t7wa%3d%3d 
Contact id: 2958 

다음을 I 도 널이 "고해상도"를 수행 한 후

Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, Uri.encode("850i%2bw7vj56otre6eqa9b9t7wa%3d%3d")); 
Uri res = ContactsContract.Contacts.lookupContact(context.getContentResolver(), lookupUri); 

: 연락처 ID를 얻기 위해 다음 코드를 사용하여 검색 키를 기반으로 연락처를 조회하려고 나는 ID가 연락처 선택 도구에서 나온 것처럼 유효하다는 것을 알고 있지만.

조회에서 고해상도의 URI를 기록 일부에서 퍼팅하는 것은 : (한 번 인코딩)

content://com.android.contacts/contacts/lookup/850i%252bw7vj56otre6eqa9b9t7wa%253d%253d 

어떤 것은 내가 그것을해야한다 생각 것입니다. 누구든지 내가 잘못하고있는 것을 발견 할 수 있습니까?

대부분의 사람들 (나 자신을 포함해서)이 작동하지만, 어떤 사람들은이 문제를 겪고 있습니다.

답변

2

Uri.encode() 대신 Uri.decode()을 사용하십시오.

편집 : the documentation에 따르면
:

조회 키가 인코딩되지 않은 추가한다 - 그것은 URI에 사용할 준비, 인코딩 된 형태로 저장된다.

따라서 URI를 인코딩하거나 디코딩하지 않아야합니다. 그대로 전달하십시오.

+0

감사합니다. 나는 그 중 하나도 갖고 있지 않았습니다. 연락처 선택 도구에서 값을 가져온 다음 인코딩을 수행 할 때 인코딩해야합니까? 내가 문제가있어 쉽게 시도 할 수없는 사용자에게 remotley를해야하는 까닭에 시험하기에 까다로운 방법입니다. 나는 그들과 함께 테스트 애플 리케이션을 가지고있어.연락처 선택 도구를 사용하게하면 조회 키가 표시됩니다. 그런 다음 연락처를 반복하고 다른 연락처 데이터를 검색하여 해당 사용자의 세부 정보를 얻으면 동일한 조회 키를 볼 수 있습니다. 유일한 차이점은 하나는 대문자이고 다른 하나는 그렇지 않은 것입니다. – Andrew

+0

''decode() '를 사용하여 제안한 이유는 키가 이미 URI로 인코딩 되었기 때문입니다 ('%'의 존재로 판단). 또한, 키의'% 2b '는 16 진수의'+'입니다. '% 3d'는'='입니다. 끝에'=='을 쓰면 키 자체가 base64로 인코딩되었음을 의미합니다 (중요하지 않음). 어쨌든, 만일 * * URI가 그 키를 인코딩한다면,'%'문자 자체는 그 16 진수 형태로'% 25'로 인코딩됩니다, 나는 옳지 않다고 느꼈습니다. 그래서 대신 해독 할 것을 제안했습니다. 아마도 하나 이상의 문제가있을 것입니다. –

+0

문서의 정보를 사용하여 답변을 편집했습니다. –

1

마찬가지로 Dheeraj V.S. 당신은 이미 인코딩 된 lookupkey를 인코딩하거나 디코딩하지 않아야하므로 다시 인코딩하면 이상한 결과가 나타날 수 있습니다. 이제 귀하의 접근 방식은 ID가 변경된 연락처에 문제가 발생한다고 생각합니다. 이 경우에는 조회 uri에 연락처의 마지막으로 알려진 키를 추가하고 어떤 일이 일어나는지 확인해야합니다. 같은

뭔가 :

Uri lookupUri = ContentUris.withAppendedId(Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupkey), contactid); 

나는 안드로이드가 문서화는 선택 사항입니다한다고하더라도이 변경되었는지 결정하기 위해 contactId의 필요하다고 생각합니다.

희망이 도움이됩니다.

+0

처음 엔 문제가 발생했을 때 인코딩/디코드 만 추가 했으므로 제거되었습니다. 연락처 ID를 추가 할 수 있지만 조회 키의 전체 아이디어는 데이터가 변경된 경우 작동한다는 것입니다. 조회 ID가 동일하게 유지되는 반면 공장 초기화 또는 새 전화 받기 후에 연락처 ID가 제거됩니다. 연락처 ID를 추가하는 것은 변경되지 않은 상황의 경우 실제로는 더 빠른 방법입니다. 이 경우 연락처 ID를 추가해도 작동하지 않습니다. – Andrew