【问题标题】:Incoming call dynamically override default ringtone来电动态覆盖默认铃声
【发布时间】:2011-03-24 04:29:03
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: android ringtone


    【解决方案1】:

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

    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。完成

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

    【讨论】:

    • 不知何故对我来说,即使铃声被有效替换,它仍然播放旧的......有什么线索吗?
    • 没有足够的信息来弄清楚。尝试查看日志。设置后尝试检查 getActualDefaultRingtoneUri 的返回值。
    • 我做了 (getActualDefaultRingtoneUri) 并且该值是正确的,如果我不在 CALL_STATE_IDLE 处将其恢复为默认值。好像系统在我更改之前获取了要播放的铃声 Uri。
    • 我仍然被要求包含WRITE_EXTERNAL_STORAGE权限
    【解决方案2】:

    从 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

    这可能足以让您入门。这是所有标准内容提供商的东西;这两项任务都有大量现有材料。

    【讨论】:

      猜你喜欢
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多