2010-03-13 9 views
6

Wie kann ich einen Klingelton nur auf den ausgewählten Kontakt anwenden?Wie kann ich einen Klingelton für einen individuellen Kontakt auf Android festlegen?

Ich habe eine Möglichkeit gefunden, den Standard-Klingelton für alle Kontakte festzulegen, aber das ist nicht mein Ziel.

Ich möchte, dass eine Anwendung über eine Schaltfläche verfügt ("Klingelton auf Kontakt anwenden"), die beim Klicken auf activityForResult eine Liste aller Kontakte auf dem Telefon anzeigt. Wenn ein Kontakt ausgewählt wird, wird die Kontaktaktivität geschlossen und mit einem URI an den Kontakt zurückgegeben. Dann muss die App den ausgewählten Klingelton auf diesen bestimmten Kontakt anwenden.

Der Code zum Anzeigen und Auswählen von Kontakten nach einer Aktivität ist bereits implementiert und scheint in der App zu funktionieren.

+1

ein droid.provider.ContactsContract.ContactOptionsColumns hat CUSTOM_RINGTONE für den Klingelton-URI, daher sollte es möglich sein, den ausgewählten Kontakt mit CUSTOM_RINGTONE für den ausgewählten Klingelton zu aktualisieren – skyman

Antwort

10

Sie können ContactsContract.Contacts verwenden, die eine Spalte CUSTOM_RINGTONE (die eine Lese-/Schreibspalte ist!) Für diesen Zweck verwenden.

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

Darüber hinaus können Sie this discussion nützlich (Code von dort genommen) finden.

+0

Danke, Das war eine sehr hilfreiche Diskussion. Viele frustrierte Entwickler über fehlende Dokumentation und Beispiele von Google. Ich werde Ihren eingefügten Code ausprobieren. Hoffentlich arbeite ich an 1.5 -> 2.1 ... Momentan funktioniert der aktuelle Code der App nur für 1.5 und 1.6, nicht für 2.0 oder 2.1 ... ZB funktioniert es für Magic, Hero und G1, aber nicht für DROID oder Nexus –

+0

Vidar Vestnes Könnten Sie bitte den endgültigen Code posten, um den Klingelton auf den Kontakt einzustellen. Ich bin mir nicht sicher, wie ich die URL einer Musikdatei zu den "ContentValues" bringen kann. – Sourav301

+0

sollte meine Klingelton-Erweiterung immer ogg sein oder kann ich auch MP3-Erweiterung verwenden? – Glolita

0

Ich weiß, das so spät war, aber ich bin Entsendung hier, weil über eine nicht für mich gearbeitet

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

Hinweis: Wir müssen Laufzeitberechtigungen für Eibisch als

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; 
} 
hinzufügen

und umfassen auch alle diese Berechtigungen in Manifest-Datei als

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