如何为Android上的单个联系人设置铃声?
如何将铃声应用于选定的联系人?如何为Android上的单个联系人设置铃声?
我找到了一种方法来设置适用于所有联系人的默认铃声,但这不是我的目标。
我想要一个应用程序有一个按钮(“应用铃声联系人”),点击后,开始一个activityForResult
显示手机上的所有联系人列表。选择联系人后,联系活动将关闭并返回到联系人的URI。然后,该应用程序需要将选定的铃声应用于该特定联系人。
通过活动显示和选择联系人的代码已经实现,似乎在应用程序上工作。
您可以使用ContactsContract.Contacts,其中有一列CUSTOM_RINGTONE
(这是一个读/写列!)用于此目的。
Uri contactUri;
ContentValues values = new ContentValues();
values.put(ContactsContract.Contacts.CUSTOM_RINGTONE,
newRingtoneUri.toString());
context.getContentResolver().update(contactUri, values, where, args);
此外,你可能会发现this discussion有用(代码取自那里)。
谢谢,这是一个非常有帮助的讨论。 Lot的开发人员缺乏来自Google的文档和示例。我会试一试你的粘贴代码。希望工作在1.5 - > 2.1 ...目前应用程序使用的当前代码仅适用于1.5和1.6,而不适用于2.0或2.1 ...例如,适用于Magic,Hero和G1,但不适用于DROID或Nexus – 2010-03-13 12:35:12
Vidar Vestnes能否请您发布最终的代码来设置联系人的铃声。我不知道如何获取音乐文件的URL并将其提供给“ContentValues”。 – Sourav301 2014-02-25 18:58:06
我的铃声扩展应该总是ogg,或者我可以使用mp3扩展? – Glolita 2014-04-03 13:20:05
我知道这是这么晚了,但我在这里张贴,因为上面一个不为我工作
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();
}
注:我们必须为蜀葵添加运行权限
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;
}
并且还在清单文件中包括所有这些权限,如
<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" />
droid.provider.ContactsContract.ContactOptionsColumns对于铃声URI具有CUSTOM_RINGTONE,所以应该可以使用CUSTOM_RINGTONE更新所选铃声 – skyman 2010-03-13 11:07:29