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:
- Android cómo obtener el número de emergencia para llamar
- Cómo redireccionar una llamada de un número a otro en android
- Mostrar la información en medio de la llamada
- ¿Cómo puedo seleccionar un contacto del registro de llamadas?
- Detectando la llamada saliente y el evento de hangup de llamada en android
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?
- Android: ¿cómo puedo iniciar una llamada telefónica en mi actividad y luego volver a ella?
- Cómo configurar el tono de timbre con RingtoneManager.ACTION_RINGTONE_PICKER?
- ¿Hacer llamadas usando telnet de un emulador de Android a otro?
- Rechazar una llamada programáticamente sin un timbre
- Transferencia de llamadas de un dispositivo a otro a través de Bluetooth
- Rechazo de la llamada entrante en android
- ¿Cómo hacer una llamada de video mediante programación en Android 2.2 o superior?
- Intención de ser despedido cuando termina una llamada?
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.