设置联系人自定义铃声,怎么做?

5

我知道如何更改手机铃声,也知道如何获取联系人,但如何为特定联系人设置铃声呢?

那么我该如何使用方法:ContactsContract.Contacts.CUSTOM_RINGTONE

我已经尝试了以下方式:

Uri contactUri = ContactsContract.Contacts.CONTENT_URI;
String[] PROJECTION = new String[] {
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.Contacts.HAS_PHONE_NUMBER,
};

String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'";
Cursor contacts = managedQuery(contactUri, PROJECTION, SELECTION, null, null );

while (contacts.moveToNext())
{
    String Name=contacts.getString(contacts.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
}

String str1 = contacts.getString(contacts.getColumnIndexOrThrow("_id"));

Uri localUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, str1);
ContentValues localContentValues = new ContentValues();
localContentValues.put(ContactsContract.Contacts.CUSTOM_RINGTONE, 
    f.getAbsolutePath()+"/Adveture.ogg");
    MainActivity.this.getContentResolver().update(localUri, localContentValues, null, null);

但是它没有起作用。

你能添加一下你是如何获取联系人的吗? - Bruno Bieri
你试过那段代码了吗?它应该会给你联系人。 - Rotary Heart
我的意思是如何让用户选择一个联系人,并将所选联系人用作上述代码的源。我找到了这个:Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); startActivityForResult(intent, CONTACT);在onActivityResult方法中,我使用Uri contactData = data.getData();来获取所选联系人,但出现了cursorIndexOutofBounds异常。 - Bruno Bieri
哦,我明白了,我没有使用那个。我创建了一个ListView活动,在其中显示所有联系人姓名。然后用户选择名称并检查每个具有所选名称的联系人。 - Rotary Heart
好的,我明白了。我需要将这一行代码 localCursor.move(Integer.valueOf(contactId)); 改为 localCursor.moveToFirst(); 因为我已经有一个联系人了,不需要将光标移动到特定位置。我会在下面发布我的完整答案。 - Bruno Bieri
2个回答

8
我找到了它的工作原理。下面是修正后的代码:
    Uri contactData = ContactsContract.Contacts.CONTENT_URI;
    String contactId = contactData.getLastPathSegment();

    Cursor localCursor = managedQuery(contactData, PROJECTION, null, null, null);
    localCursor.move(120/*CONTACT ID NUMBER*/);

    String str1 = localCursor.getString(localCursor.getColumnIndexOrThrow("_id"));
    String str2 = localCursor.getString(localCursor.getColumnIndexOrThrow("display_name"));
    Uri localUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, str1);
    ContentValues localContentValues = new ContentValues();

    localContentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
    localContentValues.put(ContactsContract.Data.CUSTOM_RINGTONE, f.getAbsolutePath()+"/Adventure.ogg");
    getContentResolver().update(localUri, localContentValues, null, null);
    Toast.makeText(this, "Ringtone assigned to: " + str2, 0).show();

只需将联系人ID号更改为您想要更改的联系人的ID即可。


我一直遇到这个错误:android.database.sqlite.SQLite Exception: no such column: custom ringtone (code 1): , while compiling: update data set custom_ringtone=? - Joy
它没有改变铃声吗?甚至没有抛出异常!有什么想法吗? - Khawar
而""/Adventure.ogg"是什么意思?因为我只是使用了确切的文件路径/sdcard/ringtone.mp3。 - Khawar
@Khawar /Adventure.ogg 是文件名。我不确定为什么它在你的设备上不起作用。你应该创建一个新的问题并粘贴你的代码。 - Rotary Heart
这里的“PROJECTION”是什么? - Hardik Joshi
显示剩余3条评论

2
使用以下代码打开Android的默认联系人搜索:
// put that constant in your class
static public final int CONTACT_CHOOSER_ACTIVITY_CODE = 73729;

// start contact search activity within any method you like
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType(ContactsContract.Contacts.CONTENT_TYPE);
startActivityForResult(intent, CONTACT_CHOOSER_ACTIVITY_CODE);

在onActivityResult方法中,您可以使用以下代码(类似于Rotary Heart的代码)来设置联系人的铃声:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case (CONTACT_CHOOSER_ACTIVITY_CODE) :
            if (resultCode == Activity.RESULT_OK) {

                try{
                    Uri contactData = data.getData();
                    String contactId = contactData.getLastPathSegment();
                    String[] PROJECTION = new String[] {
                            ContactsContract.Contacts._ID,
                            ContactsContract.Contacts.DISPLAY_NAME,
                            ContactsContract.Contacts.HAS_PHONE_NUMBER,
                    };
                    Cursor localCursor =  getContentResolver().query(contactData, PROJECTION, null, null, null);
                    localCursor.moveToFirst();
                    //--> use moveToFirst instead of this:  localCursor.move(Integer.valueOf(contactId)); /*CONTACT ID NUMBER*/

                    String contactID = localCursor.getString(localCursor.getColumnIndexOrThrow("_id"));
                    String contactDisplayName = localCursor.getString(localCursor.getColumnIndexOrThrow("display_name"));

                    Uri localUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contactID);
                    localCursor.close();
                    ContentValues localContentValues = new ContentValues();

                    localContentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contactId);
                    localContentValues.put(ContactsContract.Data.CUSTOM_RINGTONE, f.getAbsolutePath()+"/Adventure.ogg");
                    getContentResolver().update(localUri, localContentValues, null, null);

                    Toast.makeText(this, "Ringtone assigned to: " + contactDisplayName, Toast.LENGTH_LONG).show();

                } catch(Exception ex){
                    Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
            break;
    }

}

注意:您仍需要将代码中的f变量设置为您想要设置的文件(铃声)的绝对路径(f.getAbsolutePath()+"/Adventure.ogg")。
此代码已在Android 2.3上进行了测试。较高版本可能需要进行更改。

此代码已在Android 2.3上进行了测试。也许需要对更高版本进行一些更改。 - Bruno Bieri
兄弟,你忘了显示Toast(.show()),而且那个Toast消息也不太成功..!! - Nils
@Nils,你可以自由地编辑/改进我的答案。也许你指的是一个更新版本的Android。 - Bruno Bieri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接