Android: agregar tono de llamada al contacto no funciona en un contacto que acabo de agregar, pero funciona en un contacto que agregué en la sincronización anterior

Así que estoy haciendo la sincronización de la cuenta, e incluido en ese proceso es un paso donde se añade un tono personalizado. Aquí está mi método para agregar un tono de llamada:

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

Este método funciona muy bien, excepto cuando estoy agregando un contacto a la cuenta por primera vez de antemano. Mi llamada a la adición de contactos está estructurada de la siguiente manera:

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

Así como se puede ver se llama de forma muy similar, independientemente de si es un contacto nuevo o existente, pero sólo funciona en realidad para un contacto existente. Es más, todas las líneas de registro que ingresé como puntos de verificación se muestran con precisión en logcat, incluso cuando el tono de llamada no se agrega correctamente.

No puedo averiguar por la vida de mí lo que está pasando aquí, cualquier pensamientos?

Encontré una respuesta a mi pregunta. Debería hacer las preguntas SO más pronto, parece que tan pronto como le pido la respuesta me llega, incluso si yo estaba trabajando en el tema durante días.

De todos modos, aquí es lo que está pasando: el método ringtoneSync está buscando un rawContactId, que se crea cuando se hace el método addContact (). El problema es que el rawContactId no se confirma hasta que se llama batchOperation.execute ().

Así que cambiando mi contacto agregando bucle de esto:

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

A esto:

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

El proceso funciona bien.

Espero que esto pueda ayudar a alguien más en el futuro.

  • ¿Cómo iniciar llamadas de Viber desde una aplicación de Android?
  • Cómo recuperar el estado de desvío de llamadas en código de througn de Android?
  • Finalizar la llamada en android mediante programación
  • Bloquear llamadas entrantes y sms en android
  • ¿Cómo puedo volver a llamar a Android usando OAuth para Twitter?
  • Ocultar tono dtmf al marcar
  • Barra de notificación de Android abrir última actividad activa?
  • Quiero leer registros de llamadas en el android
  • Android 4.0.3 y actividad final
  • Llamar aResumo en la actividad de Android
  • Música de fondo para la llamada
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.