Беззвучный режим на Android 7

Есть ли способ отключить режим звонка на Android 7?

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.M) {
    amanager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
}

setRingerMode работает на Android 6 и более ранних версиях. Из документа:

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

Есть ли способ добиться этого, не открывая «Настройки доступа «Не беспокоить»» с помощью таких намерений, как системное приложение или разрешение при создании кода платформы, такого как это приложение, имеет разрешение «Не беспокоить» и т. Д.?


person fatih ergin    schedule 21.02.2017    source источник


Ответы (2)


Вот моя суть, чтобы помочь вам с проблемой

Я хотел переключить телефон между беззвучным и обычным режимами с помощью AudioManager, но это не сработало на Android N и выше. Подробнее в комментариях. ПРИМЕЧАНИЕ. Я сам новичок, поэтому это ни в коем случае не код уровня эксперта. Я делюсь этим, потому что я нашел очень мало помощи для этого.

    package com.junaidaziz.keepitsilent;

import android.app.NotificationManager;
import android.content.*;
import android.media.AudioManager;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;


/*
 * Created by junaidaziz on 11/13/17.
 */

public class ToggleSoundMode extends android.content.BroadcastReceiver {

    Context context;
    static AudioManager audio;

    @Override
    public void onReceive(Context context, Intent intent) {
        this.context = context;
        audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

        Log.d("BroadCast: ", " Recieved");

        toggleSoundMode();

//        Intent background = new Intent(context, BackgroundService.class);
//        context.startService(background);
    }

    public void toggleSoundMode(){
        Log.d("BroadCast: ", "toggleSoundMode");

        //if the OS version is lower than Nougat
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            handleAudioManager();
        }

        //if the OS version is Nougat or above
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){

            //first we need to get the current Notification Interruption Filter
            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            int currentMode = notificationManager.getCurrentInterruptionFilter();

            //Just for debugging
            Log.d("BroadCast: ", "currentmode " + currentMode);
            Log.d("BroadCast: ", "case 1: " + NotificationManager.INTERRUPTION_FILTER_ALARMS);
            Log.d("BroadCast: ", "case 2: " + NotificationManager.INTERRUPTION_FILTER_ALL);
            Log.d("BroadCast: ", "case 3: " + NotificationManager.INTERRUPTION_FILTER_NONE);
            Log.d("BroadCast: ", "case 4: " + NotificationManager.INTERRUPTION_FILTER_PRIORITY);
            Log.d("BroadCast: ", "case 5: " + NotificationManager.INTERRUPTION_FILTER_UNKNOWN);

            //Make the change to the notification Interruption filter First....then change the Audio Settings
            switch (currentMode){
                case NotificationManager.INTERRUPTION_FILTER_ALL: {
                    notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_NONE);  //Toggle On the Do not disturb Mode
                    break;
                }
                case NotificationManager.INTERRUPTION_FILTER_UNKNOWN: {
                    notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);  //Toggle the normal mode
                    handleRingVolume(); //With the normal interruption filter tuned on, we only need to handle the volumes.
                    break;
                }
                case NotificationManager.INTERRUPTION_FILTER_ALARMS: {
                    notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
                    handleRingVolume();
                    break;
                }
                case NotificationManager.INTERRUPTION_FILTER_NONE: {
                    notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
                    handleRingVolume();
                    break;
                }
                case NotificationManager.INTERRUPTION_FILTER_PRIORITY: {
                    notificationManager.setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_ALL);
                    handleRingVolume();
                    break;
                }
            }
        }
    }

    public void handleAudioManager(){

        //This part of code is pretty self explanatory.

        int currentMode = audio.getRingerMode();

        Log.d("BroadCast: ", "currentmode " + currentMode);
        Log.d("BroadCast: ", "case 1: " + AudioManager.RINGER_MODE_NORMAL);
        Log.d("BroadCast: ", "case 2: " + AudioManager.RINGER_MODE_VIBRATE);

        switch (currentMode) {
            case AudioManager.RINGER_MODE_NORMAL: {
                audio.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
                Log.d("BroadCast: ", "case: RINGER MODE NORMAL");
                Toast.makeText(context, "Vibration Activated", Toast.LENGTH_LONG).show();
                break;
            }
            case AudioManager.RINGER_MODE_VIBRATE: {
                Log.d("BroadCast: ", "case; RINGER MODE VIBRATE");
                audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                handleRingVolume();
                Toast.makeText(context, "Normal mode Activated", Toast.LENGTH_LONG).show();
                break;
            }
            case AudioManager.RINGER_MODE_SILENT: {
                Log.d("BroadCast: ", "case; RINGER MODE SILENT");
                audio.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
                handleRingVolume();
                Toast.makeText(context, "Normal mode Activated", Toast.LENGTH_LONG).show();
                break;
            }
        }
    }

    public void handleRingVolume(){
        audio.setStreamVolume(AudioManager.STREAM_RING, audio.getStreamMaxVolume(AudioManager.STREAM_RING), 0);
        audio.setStreamVolume(AudioManager.STREAM_NOTIFICATION, audio.getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION), 0);
        audio.setStreamVolume(AudioManager.STREAM_SYSTEM, audio.getStreamMaxVolume(AudioManager.STREAM_SYSTEM), 0);
        audio.setStreamVolume(AudioManager.STREAM_MUSIC, audio.getStreamMaxVolume(AudioManager.STREAM_MUSIC), 0);
        audio.setStreamVolume(AudioManager.STREAM_ALARM, audio.getStreamMaxVolume(AudioManager.STREAM_ALARM), 0);
        Toast.makeText(context, "Max volume", Toast.LENGTH_LONG).show();
    }}

Прочитав множество ресурсов и протестировав различные способы, я пришел к выводу, что на Android Nougat и более поздних версиях режим «Не беспокоить» диспетчера уведомлений каким-то образом переопределяет все, что связано со звуком и уведомлениями.

Поэтому, если телефон находится в режиме «Не беспокоить», вы не можете изменить настройки звука или внести какие-либо изменения, нарушающие режим «Не беспокоить». Поэтому, если вы хотите снова перевести телефон в режим звонка, вам сначала нужно изменить Notification InterruptionFiler. как только это изменится, вы также можете изменить настройки громкости. Об этом также свидетельствует тот факт, что если включен режим «Не беспокоить», Android не позволит вам изменить громкость на телефоне даже с помощью физических кнопок громкости.

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

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

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

person Junaid Aziz    schedule 16.11.2017
comment
Привет Джунаид, даже я пытаюсь сделать то же самое, но во время входящего звонка я хочу включить звук звонка, но он вообще не звонит. В пользовательском интерфейсе он увеличивает громкость, а также удаляет значок dnd, но реальный звук не воспроизводится. Вы сталкивались с такой ситуацией? - person Gautam; 10.02.2018
comment
Основываясь на том, что вы описываете, я могу предположить, что это проблема времени, с которой я тоже столкнулся. В основном, по моему опыту, телефонный звонок поступает, запускает прослушиватель вещания и включает звук ... однако входящий вызов все еще каким-то образом регистрируется на беззвучном канале .... Я понятия не имею, как это работает, но вот как Я испытал это ... Следующий входящий вызов должен иметь звук. Мне не пришлось решать эту проблему, так как мне нужен был звук при следующем входящем звонке... Так что у меня нет надежного решения для этого. - person Junaid Aziz; 11.02.2018

добавить это разрешение в манифест

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

и используйте этот код, чтобы открыть доступ к политике уведомлений.

NotificationManager notificationManager =
(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
    && !notificationManager.isNotificationPolicyAccessGranted()) {

    Intent intent = new Intent(
                        android.provider.Settings
                        .ACTION_NOTIFICATION_POLICY_ACCESS_SETTINGS);

    startActivity(intent);
}
person Binto Mathew    schedule 29.11.2018