2010-03-13 10 views
6

¿Cómo puedo aplicar un tono de llamada solo al contacto seleccionado?¿Cómo puedo establecer un tono de llamada para un contacto individual en Android?

He encontrado una manera de establecer el tono de llamada predeterminado que se aplica a todos los contactos, pero ese no es mi objetivo.

Quiero que una aplicación tenga un botón ("Aplicar tono de llamada para contactar") que, al hacer clic, inicia un activityForResult mostrando una lista de todos los contactos en el teléfono. Cuando se selecciona un contacto, la actividad de contacto se cierra y regresa con un URI al contacto. Luego, la aplicación debe aplicar el tono de llamada seleccionado a ese contacto específico.

El código para visualizar y seleccionar contactos por una actividad ya está implementado y parece funcionar en la aplicación.

+1

una droid.provider.ContactsContract.ContactOptionsColumns tiene CUSTOM_RINGTONE para el URI de tono de llamada, por lo que debería ser posible actualizar el contacto seleccionado con CUSTOM_RINGTONE para el tono de llamada seleccionado – skyman

Respuesta

10

Puede usar ContactsContract.Contacts que tiene una columna CUSTOM_RINGTONE (que es una columna de lectura/escritura) para este propósito.

Uri contactUri; 
ContentValues values = new ContentValues(); 
values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, 
    newRingtoneUri.toString()); 
context.getContentResolver().update(contactUri, values, where, args); 

Por otra parte, es posible this discussion útil (código tomado de allí).

+0

Gracias. Esa fue una discusión muy útil. Muchos desarrolladores frustrados sobre la falta de documentación y ejemplos de Google. Le daré una oportunidad al código pegado. Esperemos que trabaje en 1.5 -> 2.1 ... Por el momento, el código actual que la aplicación está usando solo funciona para 1.5 y 1.6, no para 2.0 o 2.1 ... Por ejemplo, funciona para Magic, Hero y G1, pero no para DROID o Nexus –

+0

Vidar Vestnes ¿Podría publicar el código final para establecer el tono de llamada para el contacto? No estoy seguro de cómo obtener y proporcionar la URL de un archivo de música a "ContentValues". – Sourav301

+0

mi extensión de tono de llamada siempre debe ser ogg o puedo usar la extensión mp3 también? – Glolita

0

sé que esto era tan tarde, pero yo estoy aquí porque la publicación anterior no funcionó para mí

ContentValues values = new ContentValues(); 

    ContentResolver resolver = getContentResolver(); 

    File file = new File(Environment.getExternalStorageDirectory() + "/Test/ArjunMovieTelugu.mp3"); 
    if(file.exists()) { 

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


     String contact_number = "CONTACT_NUMBER"; 
     Uri lookupUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, contact_number); 

     // The columns used for `Contacts.getLookupUri` 
     String[] projection = new String[]{ 
       ContactsContract.Contacts._ID, ContactsContract.Contacts.LOOKUP_KEY 
     }; 

     Cursor data = getContentResolver().query(lookupUri, projection, null, null, null); 

     if (data != null && data.moveToFirst()) { 
      data.moveToFirst(); 
      // Get the contact lookup Uri 
      long contactId = data.getLong(0); 
      String lookupKey = data.getString(1); 
      Uri contactUri = ContactsContract.Contacts.getLookupUri(contactId, lookupKey); 

      values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath()); 
      values.put(MediaStore.MediaColumns.TITLE, "Beautiful"); 
      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); 

      if(newUri != null){ 
       String uriString = newUri.toString(); 
       values.put(ContactsContract.Contacts.CUSTOM_RINGTONE, uriString); 
       Log.e("Uri String for " + ContactsContract.Contacts.CONTENT_URI, uriString); 
       long updated = resolver.update(contactUri, values,null, null); 

       Toast.makeText(RingtoneChange.this, "Updated : " + updated, Toast.LENGTH_LONG).show(); 
      } 

      data.close(); 
     } 


    } else { 
     Toast.makeText(RingtoneChange.this, "File does not exist", Toast.LENGTH_LONG).show(); 
    } 

Nota: Tenemos que agregar permisos de ejecución de malvavisco como

int REQUEST_ID_MULTIPLE_PERMISSIONS = 1; 

private boolean checkAndRequestPermissions() { 
int readExternal = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE); 
int writeExternal = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
int readContacts = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_CONTACTS); 
int writeContacts = ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_CONTACTS); 

List<String> listPermissionsNeeded = new ArrayList<>(); 

if (readExternal != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.READ_EXTERNAL_STORAGE); 
} 
if (writeExternal != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE); 
} 
if (readContacts != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.READ_CONTACTS); 

} 
if (writeContacts != PackageManager.PERMISSION_GRANTED) { 
    listPermissionsNeeded.add(android.Manifest.permission.WRITE_CONTACTS); 

} 

if (!listPermissionsNeeded.isEmpty()){ 
    ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray 
      (new String[listPermissionsNeeded.size()]), REQUEST_ID_MULTIPLE_PERMISSIONS); 
    return false; 
} 
return true; 
} 

e incluyen también todos estos permisos en el archivo de manifiesto como

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
Cuestiones relacionadas