2013-07-12 2 views
1

내 문제는 기본 Android 연락처 응용 프로그램에서 내 응용 프로그램의 연락처 (내 응용 프로그램 계정 유형으로 지정된 연락처)를 장치에서 삭제하려고 시도하는 것입니다.Android 기본 연락처 응용 프로그램이 모든 계정 연락처를 삭제합니다.

내 자신을 SyncAdapter으로 지정 했으므로 Service이며 syncadapter.xml에 설명 된 메타 데이터입니다. supportsUploading의 값은 거짓로 설정됩니다 (이런 식으로 내 응용 프로그램에서 만든 연락처가 읽기 전용 말)

그러나

, 나는이 메시지가 표준 연락처 앱에서 내 응용 프로그램의 연락처를 삭제하려고 할 때 이는 말한다 : 당신은 읽기 전용 계정에서 연락처를 삭제할 수 없습니다,하지만 난 상대의 데이터를 가져 오기 위해 시도 할 때까지

모든 것이 잘 보인다 연락처 목록에 에게 숨길 수

하는 이전에 삭제했습니다. 내 자신의 응용 프로그램에서 표준 "연락처"에서 d ("숨기기").

이 연락처의 RAW_CONTACT_ID에 연결된 Data 테이블에 행이 없기 때문에 반환 된 커서가 null입니다. 연락처가 장치에 있는지 확인합니다. DELETED 플래그 값이 RawContacts이고 테이블이 1로 설정되어 있으면 연락처가 삭제되었음을 알 수 있습니다.

으로 공식 문서는 설명

일부 동기화 어댑터 읽기 전용, 즉 그들 만 동기화 서버 측 전화 변경 있지만 반대로 그. 해당 연락처 중 하나 인 원시 연락처에 삭제 표시가되어 있으면 휴대 전화에 남아 있습니다. 집합체 연락처의 일부가 아니기 때문에 실제로 보이지 않습니다.

문제는 연락처 데이터베이스에서 검색하는 방법을 모르기 때문에 응용 프로그램에이 연락처의 데이터를 더 이상 표시 할 수 없다는 것입니다. 누군가이 상황을 어떻게 처리해야하는지 알고 있다면 조언을 해주시면 감사하겠습니다. 감사합니다

답변

1

그래서 더 세심한 검색 후 다른 응용 프로그램에서 삭제되었는지 여부와 상관없이 내 응용 프로그램에서 모든 RAW_CONTACT에 대한 데이터를 검색하는 방법을 발견했습니다.

RawContacts.Entity API를 사용하면이 작업이 수행됩니다.

는 이전에 나는 그런 논리를 사용하여 연락처의 데이터를 검색하려고 :

public Cursor getContactData(long rawContactId) { 
    return getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, 
      ContactsContract.Data.RAW_CONTACT_ID + "=" + rawContactId, null); 
} 

그리고이 방법은 항상 삭제 된 연락처에 대한 null를 반환했습니다.

그러나 RawContacts.Entity 같은 방법으로 사용 :

public Cursor getContactData(long rawContactId) { 
    Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, id); 
    rawContactUri = Uri.withAppendedPath(rawContactUri, RawContacts.Entity.CONTENT_DIRECTORY); 

    return getResolver().query(rawContactUri, null, null, null); 
} 

는 관계없이 3 차원 자 응용 프로그램이나하지에 의해 삭제 된 적절한 권한을 가진 응용 프로그램 내에서 연락처의 데이터를 가져올 수 있습니다.

+0

나는 이것이 사실이어야한다는 것에 놀랐습니다. 나는 그것이 [developer.android.com에 대한 설명] (https://developer.android.com/reference/android/provider/ContactsContract.RawContacts.Entity.html)과 충돌하고 있다고 혼란스러워합니다. – cocoa

관련 문제