2

현재 모바일 연락처를 서버에 동기화하려는 안드로이드 프로젝트에서 작업 중입니다. SyncAdapter에 대한 많은 연구와 계정 만들기 accountmanager에 대해 많은 것을 배우고 직접 배웠습니다. 그러나 내가 이해하지 못하는 두 가지가 있습니다. 나는 이것들을 구글에서 검색했지만 완전한 답을 얻을 수 없었습니다. 제발 질문을 복제하지 말아주세요, 어떻게 작동하는지 더 명확하게 알고 싶습니다.SyncAdapter, Working를 사용하여 연락처 동기화하기

  1. Google 문서에 따르면 동기화가 완료 될 때마다 연락처의 더티 플래그가 변경됩니다. 내 연락처는 어떤 연락처가 서버로 이동하는지 프로그래밍 방식으로 지정하고 있기 때문에 안드로이드 OS가 특정 연락처의 동기화 상태를 어떻게 감지 할 것인가?

예 : - 다음 예에서 서버에 번들을 보내려고합니다.

Bundle extras = new Bundle(); 
     extras.putInt("contact name after filtering", "number after filtering"); 
     ContentResolver.requestSync(account,ContactsContract.AUTHORITY, extras); 

onPerformSync 방법으로 수신 된 번들 엑스트라는 서버로 전송됩니다.

@Override 
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { 

    for (String key : extras.keySet()) 
    { 
     Log.d("Bundle Debug", key + " = \"" + extras.get(key) + "\""); 
    } 

     //Code to send to server 

} 

의가 위의 예에서 생각한이 변수 엑스트라 연락처 목록의 변화를 필터링 한 후 얻은 번들입니다는 SyncAdapter 프레임 워크 또는 OS가 변화를 감지하고 더러운 갱신하는 server.Now하도록 업데이트 할 그 연락의 국기? 물론 AUTHORITY을 제공했는데, 어떻게 변화가 있었는지 찾는 데 도움이되는지 모르겠습니다. 위의 방법은 구현하는 올바른 방법은 무엇입니까?

  1. 동기화가 실패했는지 확인하는 방법은 무엇입니까? 또는 완료?
+0

설명이 있으십니까? – Naroju

답변

0

컨텐트 프로를 만들 것입니다 열린 우리당에 CALLER_IS_SYNC_ADAPTER없이 끝났다 연락처의 모든 수정 1에 수정 된 연락처의 DIRTY 플래그를 설정합니다. 마찬가지로 해당 매개 변수가없는 모든 삭제 요청은 연락처를 삭제하는 대신 DELETED 플래그를 설정합니다.

SyncAdapter는 더티 또는 DELETED 플래그가 지정된 연락처를 쿼리하고 적절한 조치를 취하거나 (서버에 새 연락처 데이터를 보내거나 서버에서 연락처를 삭제) 더티 플래그를 지우고 (0으로 오버라이드하여) CALLER_IS_SYNCADAPTER 매개 변수가있는 경우) 또는 연락처를 다시 삭제하여 제거를 완료합니다 (다시 CALLER_IS_SYNCADAPTER 매개 변수가 있음).

DELETED0으로 설정하여 대화 상대의 "삭제 취소 취소"를 할 수 없다고 생각합니다. 내 경험에 의하면 그 시점에서 연락처 데이터가 이미 삭제 되었기 때문입니다. RawContact 항목 만 남았습니다 (하지만 마지막으로 시도했을 때 오작동하는 장치가 있었을 수도 있습니다).

CALLER_IS_SYNCADAPTER을 지정하는 것이 중요합니다. 그렇지 않으면 아무 것도 일어나지 않을 것이며 SyncAdapter는 이러한 연락처를 반복해서 동기화하려고 할 것입니다.

질문 2 :

전적으로 SyncAdapter에 달려 있습니다. 연락처를 동기화하는 코드를 작성하면 성공했는지 여부를 알리는 SyncAdapter 만 있습니다. 일반적으로 동기화 중에 예외가 발생하지 않으면 성공했다고 가정 할 수 있습니다.

+0

연락처 응용 프로그램에서 연락처를 수동으로 편집/업데이트하려고하면 기본 a/c에서 원시 연락처 만 편집 할 수 있고 다른 Contacts (동일한 Contacts._ID를 가리키는)는 편집 할 수 없다는 것을 알게되었습니다. 그래서 내 질문은 사용자가 수동으로 rawcontact (기본 계정)를 업데이 트하는 경우, 그것은 DIRTY 플래그가 '1'로 설정됩니다. 또한 다른 연결된 rawcontacts의 DIRTY 플래그를 설정하여 서버와 업데이트 및 동기화 할 수 있습니까? – epiphany27

+0

더티 플래그는 rawcontact마다 처리됩니다. 실제로 수정 된 rawcontact 만 더러워집니다. 귀하의 동기화 응용 프로그램은 다른 계정의 원시 연락처를 조사하지 않아야합니다. 원시 연락처를 편집 할 수없는 경우 문제가있을 수 있습니다. 계정이 읽기 전용으로 간주되거나 연락처 앱이 손상되었습니다. – Marten

+0

^죄송합니다. 이전 의견에서 나는 분명하지 않다고 생각합니다. 내가 의미 한 바는 사용자가 내 기기의 기본 주소록 수정 화면에서 내 앱의 ACCOUNT_TYPE에 연결된 rawcontacts를 직접 수정 한 경우를 감지하고자했습니다. 내가 뭘 알아 봤어, 기본 rawcontacts (구글이나 장치 로컬) 만 원시 접촉 화면에서 편집 할 수있는 반면, whatsapp, skype와 같은 rawcontacts는 편집 할 수 없습니다. 읽기 전용 모드로만 표시됩니다. (네이티브 연락처 앱에서도 링크 된 연락처를 편집 할 수 있다고 생각되면 알려주세요). 따라서이 경우 연결된 rawcontacts에 대한 DIRTY 플래그는 절대로 설정되지 않습니다. – epiphany27

관련 문제