После включения телефона при звонке только вибрирует телефон, не в состоянии воспроизводить рингтон - PullRequest
0 голосов
/ 29 октября 2018

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

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

И ожидайте, что Телефон будет вибрировать и воспроизводить мелодию звонка .

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

Я нашел много приложений в магазине, которые могут включать звук до звонка, воспроизводить мелодию звонка и вибрировать оба. Пример: Ссылка на одно приложение

Мой код ниже:

public void onReceive(Context context, Intent intent) {
    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

    if (intent.getAction()!=null && intent.getAction().equals("android.intent.action.PHONE_STATE")){

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){

            audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
            audioManager.setStreamVolume(AudioManager.STREAM_RING, maxVolume/2, AudioManager.FLAG_PLAY_SOUND);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Я работаю над чем-то очень похожим. Вы на самом деле должны воспроизводить рингтон после переопределения настроек звука. Но вам нужно сделать это только на Android 6.0+. Получить экземпляр рингтона и воспроизводить его, когда звонит состояние телефона, в противном случае просто остановите его.

public void onReceive(Context context, Intent intent) {
    AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_RING);

    Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
    Ringtone r = RingtoneManager.getRingtone(context, uri);

    if (intent.getAction()!=null && intent.getAction().equals("android.intent.action.PHONE_STATE")){

        String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

        if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)){

        audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
        audioManager.setStreamVolume(AudioManager.STREAM_RING, maxVolume/2, AudioManager.FLAG_PLAY_SOUND);

        r.play();

        }else {

        r.stop();

        }
    }
}

Проблемы, с которыми вы столкнетесь в этой реализации. Вы получите несколько мелодий звонка, потому что метод onReceive вызывается много раз при изменении состояния телефона. Каждый раз при вызове onReceive предоставляется новый контекст и каждый раз создается новый экземпляр рингтона. Я запустил фоновый сервис, чтобы исправить эту проблему, чтобы я мог хранить одну ссылку на контекст и, следовательно, одну ссылку на мелодию звонка.

0 голосов
/ 05 ноября 2018

Некоторые устройства могут не иметь регулировки громкости и могут работать с фиксированной громкостью, а также могут не включать приглушение звука или изменение громкости аудиопотоков.

isVolumeFixed ()

Этот метод вернет true на таких устройствах.

...