【问题标题】:Put Lollipop into Silent Mode/Mute Mode not Priority Mode将棒棒糖置于静音模式/静音模式而非优先模式
【发布时间】:2015-08-24 03:04:33
【问题描述】:

目前我正在使用以下方法将手机置于静音模式:

AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);

但我注意到,在 Lollipop 中,它会将手机置于“优先模式”,通知栏顶部有一个小星星。但我希望它是 100% 静音而不是“优先模式”。这可能吗?要将 Lollipop 设置为 100% 静音?

我尝试像这样将 setRingerMode 设置为 0

audioManager.setRingerMode(0);

但它仍然给我星号而不是扬声器,它通过它并在它下面的括号中显示以(优先级)振动。

【问题讨论】:

    标签: android


    【解决方案1】:

    在 Android 5.0.X 中,调用 setRingerMode(RINGER_MODE_SILENT) 将 (i) 触发“优先模式”,这将 (ii) 随后触发振铃模式更改回 RINGER_MODE_NORMAL。

    利用 Android 5.0.X 中的一个错误,一种残酷的解决方法是在触发上述操作 (ii) 后的短时间内(例如 500 毫秒)再次发出 setRingerMode(RINGER_MODE_SILENT) 调用。但这当然不合适,应该在 Android 5.1.X 中停止工作。

    在 5.X 中实现 100% 静音的正确方法是切换到“无”中断模式。这可以通过创建一个扩展NotificationListenerService的服务,注册它,并通过在服务中调用requestInterruptionFilter(INTERRUPTION_FILTER_NONE)来提供设置中断模式的功能来实现。 Here (Noyze app) 就是一个例子。然后,您可以从您的活动中调用该函数以切换到该模式。

    为此,您需要BIND_NOTIFICATION_LISTENER_SERVICE 权限,并明确授予用户通知访问权限。

    注意:您可能知道INTERRUPTION_FILTER_NONE 确实意味着 100% 静音,闹钟将停止工作。

    【讨论】:

    • 这是要走的路。不幸的是,谷歌表示更改为 RINGER_SILENT_MODE 将切换到优先级,我检查并非所有设备都如此。 requestInterruptionFilter 似乎是要走的路(也是激活无模式的唯一方法)。但是用户必须明确授予权限是一种痛苦......
    【解决方案2】:

    Google 已从棒棒糖中移除静音模式。这里is the link to official android issue page

    将设备设置为 RINGER_MODE_SILENT 会导致设备进入 新的优先模式。如果您设置,设备将离开优先模式 到 RINGER_MODE_NORMAL 或 RINGER_MODE_VIBRATE。

    您阅读了有关它的更多信息here

    【讨论】:

    • 他们这样做令人失望。我希望我的手机在工作时 100% 进入静音模式,而现在我必须每天手动执行此操作?
    • 很遗憾是的,但您可以使用振动模式或使用优先模式并设置优先级。不过,您将不得不搜索教程。
    • 我刚刚写了一个可以在pre Lollipop上运行的应用程序,但不能在lollipop上运行,这非常令人失望。
    • 这里也一样。我有nexus 4,我对谷歌完全失望。
    【解决方案3】:

    我通过两次调用setRingerMode(AudioManager.RINGER_MODE_SILENT) 解决了这个问题,因为 Lollipop 首先将设备置于优先模式而不是静音模式。

    final AudioManager audiomanage = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
        audiomanage.setRingerMode(AudioManager.RINGER_MODE_SILENT);
        new Thread(new Runnable() {
    
            public void run() 
            {
                try 
                {
                    Thread.sleep(100);
                    audiomanage.setRingerMode(AudioManager.RINGER_MODE_SILENT);             
                } 
                catch (InterruptedException e) 
                {
                    e.printStackTrace();
                }
            }
        }).start();
    

    【讨论】:

    • 这是 Android 5.0 中的一个错误,已在 Android 5.1 中修复。该代码仅适用于 5.0。
    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    相关资源
    最近更新 更多