2010-03-13 3 views
6

Comment puis-je appliquer une sonnerie uniquement au contact sélectionné?Comment puis-je définir une sonnerie pour un contact individuel sur Android?

J'ai trouvé un moyen de définir la sonnerie par défaut qui s'applique à tous les contacts, mais ce n'est pas mon objectif.

Je souhaite qu'une application possède un bouton ("Appliquer la sonnerie au contact") qui, une fois cliqué, démarre une activityForResult affichant la liste de tous les contacts du téléphone. Lorsqu'un contact est sélectionné, l'activité de contact se ferme et retourne avec un URI au contact. Ensuite, l'application doit appliquer la sonnerie sélectionnée à ce contact spécifique.

Le code d'affichage et de sélection des contacts par une activité est déjà implémenté et semble fonctionner sur l'application.

+1

une droid.provider.ContactsContract.ContactOptionsColumns a CUSTOM_RINGTONE pour l'URI de sonnerie, donc il devrait être possible de mettre à jour le contact sélectionné avec CUSTOM_RINGTONE pour la sonnerie sélectionnée – skyman

Répondre

10

Vous pouvez utiliser ContactsContract.Contacts qui a une colonne CUSTOM_RINGTONE (qui est une colonne de lecture/écriture!) À cet effet.

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

De plus, vous trouverez peut-être utile this discussion (code tiré de là).

+0

Merci, Ce fut une discussion très utile. Beaucoup de développeurs frustrés sur le manque de documentation et d'exemples de Google. Je vais essayer votre code collé. Espérons travailler sur 1.5 -> 2.1 ... Pour l'instant le code actuel que l'application utilise ne fonctionne que pour 1.5 et 1.6, pas pour 2.0 ou 2.1 ... Par exemple cela fonctionne pour Magic, Hero et G1, mais pas pour DROID ou Nexus –

+0

Vidar Vestnes Pourriez-vous s'il vous plaît poster le code final pour définir la sonnerie pour le contact. Je ne sais pas comment obtenir et fournir l'URL d'un fichier de musique à "ContentValues". – Sourav301

+0

est-ce que mon extension de sonnerie devrait toujours être ogg ou je peux utiliser aussi l'extension mp3 ?? – Glolita

0

Je sais que c'était si tard, mais je signale ici parce que ci-dessus, on ne travaille pour moi

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

Note: Nous devons ajouter des autorisations d'exécution pour guimauve comme

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

et comprennent également toutes ces autorisations dans le fichier Manifest comme

<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" /> 
Questions connexes