Входящий вызов динамически переопределяет мелодию звонка по умолчанию

Мое приложение позволяет указать разные мелодии звонка для разных входящих событий. Например: входящий звонок, входящее SMS и т. д.

То, что я пытаюсь сделать, это когда я получаю, например, входящий звонок, я проверяю базу данных своих приложений, если выбран конкретный параметр, и если есть параметр мелодии звонка, установите воспроизведение этой мелодии.

Однако проблема, с которой я сталкиваюсь, заключается в том, что я не могу переопределить / остановить воспроизведение мелодии телефона по умолчанию.

Я пробовал несколько разных способов, но из документов большинство этих методов останавливают только текущий экземпляр и не являются глобальными методами.

Я не могу установить мелодию звонка в настройках мелодии телефона по умолчанию, так как она должна быть динамической в ​​зависимости от входящего вызова.

Если кто-нибудь знает трюк или способ сделать это, это было бы здорово. Я надеюсь, что в этом есть смысл.


person userdelroot    schedule 02.08.2010    source источник


Ответы (2)


Есть несколько шагов для динамического изменения мелодии звонка.

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. Готово

Основная идея заключается в перехвате входящего звонка и замене рингтона на свой. И, конечно же, вы должны восстановить мелодию звонка по умолчанию до сохраненного значения после звонка.

person asktomsk    schedule 10.03.2012
comment
Почему-то для меня, даже жесткая мелодия эффективно заменена, она все еще играет старую ... есть подсказка? - person BrainCrash; 08.10.2013
comment
Недостаточно информации, чтобы разобраться. Попробуйте посмотреть логи. Попробуйте проверить возвращаемое значение getActualDefaultRingtoneUri после его установки. - person asktomsk; 08.10.2013
comment
Я сделал (getActualDefaultRingtoneUri), и значение правильное, и оно будет значением по умолчанию, если я не верну его обратно в CALL_STATE_IDLE. Кажется, что система получает рингтон Uri для воспроизведения до того, как я его изменю. - person BrainCrash; 09.10.2013
comment
Меня по-прежнему просят включить WRITE_EXTERNAL_STORAGE разрешение - person Olayinka; 18.05.2014

Начиная с 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

Этого может быть достаточно, чтобы вы начали. Это все стандартные материалы поставщика контента; много существующего материала для обеих задач.

person escape-llc    schedule 19.10.2011