13

我的应用程序允许您为不同的传入事件指定不同的铃声。EG:来电、来电等。

我想要完成的是,例如当我收到来电时,我检查我的应用程序数据库是否选择了特定选项以及是否有铃声选项设置播放该铃声。

但是我遇到的问题是我无法覆盖/停止播放默认电话铃声。

我尝试了几种不同的方法,但是从文档中,大多数方法只停止当前实例,而不是全局方法。

我无法在默认电话铃声设置中设置铃声,因为它需要根据来电进行动态设置。

如果有人知道实现此目的的技巧或方法,那就太好了。我希望这是有道理的。

4

2 回答 2

12

有几个步骤可以动态更改铃声。

1.准备铃声

    File k = new File("/sdcard/ringtone", "kolyan_.mp3");
    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, "My Song title");
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg");
    values.put(MediaStore.Audio.Media.ARTIST, "Some Artist");
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
    values.put(MediaStore.Audio.Media.IS_ALARM, false);
    values.put(MediaStore.Audio.Media.IS_MUSIC, false);

2.插入数据库

    Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
    // Line below is major because we need to delete old entry
    getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
    mUri = getContentResolver().insert(uri, values);

3.保存当前默认铃声并订阅CallListener

    // Be careful by calling getActualDefaultRingtoneUri in CallListener, it could return null, better way to save it in OnCreate
    mOldUri = RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);

    TelephonyManager mTelephonyMgr = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
    mTelephonyMgr.listen(new MyCallListener(), PhoneStateListener.LISTEN_CALL_STATE);

4. 创建 MyCallListener 类

class MyCallListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
            case TelephonyManager.CALL_STATE_RINGING:
                // On call you replace the ringtone with your own mUri
                RingtoneManager.setActualDefaultRingtoneUri(
                        MainActivity.this,
                        RingtoneManager.TYPE_RINGTONE,
                        mUri
                );
                break;
            case TelephonyManager.CALL_STATE_IDLE:
                // Restore the default ringtone
                RingtoneManager.setActualDefaultRingtoneUri(
                        MainActivity.this,
                        RingtoneManager.TYPE_RINGTONE,
                        mOldUri
                );
                break;
            default:
                break;
        }

        super.onCallStateChanged(state, incomingNumber);
    }
}

5.为你的AndroidManifest.xml添加权限

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>

6. 完成

主要思想是接听来电并自己替换铃声。当然,您应该在通话后将默认铃声恢复为保存的值。

于 2012-03-10T04:34:48.840 回答
4

从 API 5 (Android 2.x) 开始,联系人数据库有一个 CUSTOM_RINGTONE 字段,请参阅此页面:

http://developer.android.com/reference/android/provider/ContactsContract.ContactOptionsColumns.html#CUSTOM_RINGTONE

此字段的值必须是content://媒体文件的 URI。您可以从MedciaStore内容提供商处获取:

http://developer.android.com/reference/android/provider/MediaStore.MediaColumns.html

这可能足以让你开始。这是所有标准内容提供者的东西;这两项任务都有大量现有材料。

于 2011-10-19T11:01:28.600 回答