2011-12-21 3 views
4

계정 동기화를 수행 중이며 해당 과정에 포함 된 단계는 맞춤식 벨소리가있는 단계입니다. 덧붙였다.Android : 연락처에 벨소리를 추가하는 기능이 방금 추가 한 연락처에서 작동하지 않지만 이전 동기화시 추가 한 연락처에서 작동합니다.

private static void ringtoneSync(ContentResolver resolver, String username, Context context) { 
    ContentValues values = new ContentValues(); 
    Log.e("SYNC", "setting ringtone for " + username); 

    long rawContactId = lookupRawContact(resolver, username); 
    long contactId = getContactId(resolver, rawContactId); 

    File root = Environment.getExternalStorageDirectory(); 
    TagDBAdapter adapter = new TagDBAdapter(context); 
    adapter.open(); 
    String ringtone = adapter.getContactRingtonePath(username); 
    adapter.close(); 

    Log.e("test", "ringtone checkpoint name here: " + ringtone); 

    File file = new File(root, "tag/ringtones/"+ ringtone + ".mp3"); 
    if(file.exists()) { 

     Log.e("test", "ringtone checkpoint if file exists"); 

     Uri oldUri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); 
     resolver.delete(oldUri, MediaStore.MediaColumns.DATA + "=\"" + file.getAbsolutePath() + "\"", null); 

     values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); 
     values.put(MediaStore.MediaColumns.TITLE, ringtone); 
     values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3"); 
     values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 

     Uri uri = MediaStore.Audio.Media.getContentUriForPath(file.getAbsolutePath()); 
     Uri newUri = resolver.insert(uri, values); 
     String uriString = newUri.toString(); 
     values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, uriString); 
     Log.e("Uri String for " + username, uriString); 
     resolver.update(ContactsContract.Contacts.CONTENT_URI, values, Contacts._ID + "=" + contactId, null); 
    } 
} 

이 방법은, 위대한 작품을 내가 사전에 처음으로 계정에 연락처를 추가하고 때를 제외하고 : 여기에 벨소리를 추가하는 나의 방법이다. 당신이 신규 또는 기존 연락처의 경우 매우 유사 관계라고 볼 수 있습니다 그래서

for(Contact contact : friends) { 
     Log.e("SYNCING CONTACTS", "Start for loop"); 
     username = contact.getUsername(); 
     rawContactId = lookupRawContact(resolver, username); 
     if(rawContactId != 0) { 
      if(!contact.isDeleted()) { 
       Log.e("SYNCING CONTACTS", "Updating " + username); 
       updateContact(context, resolver, account, contact, rawContactId, batchOperation); 
       ringtoneSync(resolver, username, context); 

      } 
      else { 
       Log.e("SYNCING CONTACTS", "Deleting " + username); 
       deleteContact(context, rawContactId, batchOperation); 
      } 
     } 
     else { 
      if(!contact.isDeleted()) { 
       Log.e("SYNCING CONTACTS", "Adding " + username); 
       addContact(context, account, contact, batchOperation); 
       ringtoneSync(resolver, username, context); 
      } 
     } 

을하지만, 실제로 기존 연락처에 대한 작동 : 추가 연락처에 내 호출은 다음과 같이 구성되어있다. 또한 벨소리가 성공적으로 추가되지 않은 경우에도 체크 포인트로 입력 한 모든 로그 라인이 정확하게 logcat에 표시됩니다.

나는 무슨 일이 일어나고 있는지, 어떤 생각이든 내 인생을 생각할 수 없다.

답변

2

내 질문에 대한 답변을 찾았습니다. 나는 SO 문제를 더 일찍 물어야한다. 문제를 며칠간 풀어 봤다해도 대답을하자마자 나에게 찾아온다.

어쨌든 다음과 같이 진행됩니다. ringtoneSync 메서드는 addContact() 메서드를 수행 할 때 만들어지는 rawContactId를 찾고 있습니다. 문제는 rawContactId가 batchOperation.execute()를 호출 할 때까지 커밋되지 않는다는 것입니다. 이에서 루프를 추가 내 연락처를 변경하여

그래서 :

 if(rawContactId != 0) { 
      if(!contact.isDeleted()) { 
       Log.e("SYNCING CONTACTS", "Updating " + username); 
       updateContact(context, resolver, account, contact, rawContactId, batchOperation); 
       ringtoneSync(resolver, username, context); 

      } 
      else { 
       Log.e("SYNCING CONTACTS", "Deleting " + username); 
       deleteContact(context, rawContactId, batchOperation); 
      } 
     } 
     else { 
      if(!contact.isDeleted()) { 
       Log.e("SYNCING CONTACTS", "Adding " + username); 
       addContact(context, account, contact, batchOperation); 
       ringtoneSync(resolver, username, context); 
      } 
     } 

이 사람 :

 if(rawContactId != 0) { 
      if(!contact.isDeleted()) { 
       Log.e("SYNCING CONTACTS", "Updating " + username); 
       updateContact(context, resolver, account, contact, rawContactId, batchOperation); 
       ringtoneSync(resolver, username, context); 

      } 
      else { 
       Log.e("SYNCING CONTACTS", "Deleting " + username); 
       deleteContact(context, rawContactId, batchOperation); 
      } 
     } 
     else { 
      if(!contact.isDeleted()) { 
       Log.e("SYNCING CONTACTS", "Adding " + username); 
       addContact(context, account, contact, batchOperation); 
/* -------> */ batchOperation.execute(); //EXECUTE BATCH OPERATION BEFORE SYNCING RINGTONE 
       ringtoneSync(resolver, username, context); 
      } 
     } 

과정은 잘 작동합니다.

희망이 있으면 다른 사람을 도울 수 있기를 바랍니다.