【问题标题】:Manually mute sound in Android app when in silent mode?在静音模式下,在 Android 应用程序中手动静音?
【发布时间】:2015-09-01 01:35:39
【问题描述】:

我已尝试找到此问题的答案,但我的搜索不断返回不相关的结果...
所以问题是 - 我正在编写一个播放音效的游戏(还没有音乐),我将流类型设置为音乐。但是,当我将手机置于静音模式(也没有振动,如果这很重要)时,应用程序仍然会播放声音。我可以使用音量键关闭应用程序中的声音,但我所期望的(以及我未来的用户可能也会期望的)是当手机处于静音模式时应用程序不会发出声音。

在这一点上,我不确定这是否应该由操作系统自动管理,或者我是否应该对此做些什么。我肯定可以检测到静音模式,将音量设置为 0,例如 onResume,但这可能会覆盖用户通过按下音量按钮设置的设置 - 所以当他们取消手机静音时,应用程序要么必须设置以编程方式将音量设置为预定义的值,或者理想情况下,将音量设置为从 sharedPrefs 中保存的值……这听起来相对繁琐。有更好的解决方案吗?

这就是我初始化然后使用声音的方式:

soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new SparseIntArray();
soundPoolMap.put(CLICK_1, soundPool.load(activity, R.raw.click1, 1));
soundPoolMap.put(CLICK_2, soundPool.load(activity, R.raw.click2, 2));
...
float volume = 1.0f;
soundPool.play(soundPoolMap.get(soundID), volume, volume, 1, 0, 1f);

【问题讨论】:

    标签: android audio


    【解决方案1】:

    我从您的问题中了解到,您想在设备开启 silent mode 时将您的应用静音。

    尝试每次在应用播放声音/音乐之前检查RingerMode,并且只有在铃声RingerMode 正常时才播放声音。

    这里是示例代码。

    AudioManager audio = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
    switch (audio.getRingerMode())
    {
        case AudioManager.RINGER_MODE_NORMAL:
        // Device is on Normal mode.
        // you can play music.
        break; 
        case AudioManager.RINGER_MODE_SILENT:
        // Device is on Silent mode.
        // you should not play sound now.
        break;
        case AudioManager.RINGER_MODE_VIBRATE:
        // Device is on Vibrate/Meeting mode.
        // you should not play sound but you can make vibrate device (if you want).
        break;
    }
    

    【讨论】:

    • 很好的答案。改进:始终根据当前的 RingerMode 开始播放和控制 MediaPlayer 的音量。如果在当前播放期间 RingerMode 发生变化,还可以启动音频监视器循环以执行相同的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多