当前位置:首页 > 安卓源码 > 技术博客 >

如何在Android上禁用大容量警告消息

时间:2020-08-02 17:51 来源:互联网 作者:源码搜藏 浏览: 收藏 挑错 推荐 打印

两种单独的解决方案:用于无根设备和有根设备 本文介绍了为什么和何时出现此对话框,以及如何消除此对话框。 介绍 有时,当您将耳机与Android设备配合使用时,媒体音量可能会突然下降,并且无法将音量调高。 为此,您必须解锁设备并接受警告: 对话框出现的
两种单独的解决方案:用于无根设备和有根设备
本文介绍了为什么和何时出现此对话框,以及如何消除此对话框。

介绍

有时,当您将耳机与Android设备配合使用时,媒体音量可能会突然下降,并且无法将音量调高。为此,您必须解锁设备并接受警告:

如何在Android上禁用大容量警告消息

对话框出现的时间是无法预测的:当您开车或骑自行车,手脏或弄湿等时,可能会出现该对话框。当然,通过耳机听大声的音乐可能会损害听力。但是设备无法识别所连接的设备:耳机或扬声器。对于演讲者来说,此消息毫无意义。

为什么会出现

听力系统有WHO-ETU标准。在欧盟和其他一些国家/地区,必须强制使用它们。这些标准根据音量和收听时间来描述人们的声音容限。

如何在Android中实现

根据MCC(移动国家/地区代码),可以启用或禁用警告。它由资源定义R.bool.config_safe_media_volume_enabled。如果启用了警告,则系统会计算“不安全的收听”时间,并在达到20小时后显示警告。
当音量大于85 dB且连接了耳机时,则认为收听“不安全”。累积的“不安全收听”时间存储在其中,Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS并每分钟更新一次。
安全监听系统逻辑在AudioService.java中实现。

根目录设备的解决方法

设置audio.safemedia.bypass=true在文件系统/ build.properties:

为什么它应该起作用?
让我们看一下AudioService.java中的一些字段:

// mSafeMediaVolumeState indicates whether the media volume is limited over headphones.
// It is SAFE_MEDIA_VOLUME_NOT_CONFIGURED at boot time until a network service is connected
// or the configure time is elapsed. It is then set to SAFE_MEDIA_VOLUME_ACTIVE or
// SAFE_MEDIA_VOLUME_DISABLED according to country option. If not SAFE_MEDIA_VOLUME_DISABLED, 
// it can be set to SAFE_MEDIA_VOLUME_INACTIVE by calling AudioService.disableSafeMediaVolume()
// (when user opts out).
private static final int SAFE_MEDIA_VOLUME_NOT_CONFIGURED = 0;
private static final int SAFE_MEDIA_VOLUME_DISABLED = 1;
private static final int SAFE_MEDIA_VOLUME_INACTIVE = 2;  // confirmed
private static final int SAFE_MEDIA_VOLUME_ACTIVE = 3;    // unconfirmed
private Integer mSafeMediaVolumeState;

该字段mSafeMediaVolumeState 保持当前的安全监听状态:

  • DISABLED:禁用安全监听(音量级别不受控制)
  • ACTIVE:启用了安全监听,“不安全监听”时间已达到20小时,用户必须确认对话框才能提高音量
  • INACTIVE:启用了安全监听,“不安全监听”时间尚未达到20小时

我们需要mSafeMediaVolumeState 分配给DISABLED。
初始值在这里分配:

private void onConfigureSafeVolume(boolean force, String caller) {
   ...
   boolean safeMediaVolumeEnabled =
           SystemProperties.getBoolean("audio.safemedia.force", false)
                   || mContext.getResources().getBoolean(
                 com.android.internal.R.bool.config_safe_media_volume_enabled);

   boolean safeMediaVolumeBypass =
           SystemProperties.getBoolean("audio.safemedia.bypass", false);

   int persistedState;
   if (safeMediaVolumeEnabled && !safeMediaVolumeBypass) {
       persistedState = SAFE_MEDIA_VOLUME_ACTIVE;
       /* Omitted code. Here mSafeMediaVolumeState is assigned to ACTIVE, or INACTIVE */
...
   } else {
       persistedState = SAFE_MEDIA_VOLUME_DISABLED;
       mSafeMediaVolumeState = SAFE_MEDIA_VOLUME_DISABLED;
   }

DISABLED在两种情况下,可以将其分配给:什么时候R.bool.config_safe_media_volume_enabled=true(我们不能更改)或什么时候audio.safemedia.bypass = true(我们可以使用root特权进行更改)。

无根的解决方法

解决方案是监视的值,Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS并且不允许其超过20小时。接近阈值时应重置该值。

如何读取当前值

int unsafeMs = Settings.Secure.getInt(contentResolver, "unsafe_volume_music_active_ms")

使用adb相同

adb shell settings get secure unsafe_volume_music_active_ms

如何更新价值

首先,授予更改安全设置的权限:

adb shell pm grant com.example.app android.permission.WRITE_SECURE_SETTINGS

可以完成,因为此许可权具有“,”, 然后调用:protectionLevel="signature|privileged|development
 

Settings.Secure.putInt(contentResolver, "unsafe_volume_music_active_ms"
, 1)

它必须为1,因为0值与ACTIVE状态相关联。

使用adb也是一样:

adb shell settings put secure unsafe_volume_music_active_ms 1

值更新后,我们需要让AudioService读取并使用它。根据源代码,唯一的方法是重新启动它。音频服务是一项系统服务,因此要重新启动它,必须重新启动设备(或者用户可以重新登录)。

为了使该解决方案更易于使用,我为一个小型应用程序编写了代码,该应用程序会定期检查该Settings.Secure.UNSAFE_VOLUME_MUSIC_ACTIVE_MS值并提醒重新启动设备。

当然,重新启动或重新登录需要花费时间,但是此解决方案不需要root特权。


如何在Android上禁用大容量警告消息 转载https://www.codesocang.com/appboke/46140.html

技术博客阅读排行

最新文章