<span id="ld197"><th id="ld197"><progress id="ld197"></progress></th></span>
<menuitem id="ld197"></menuitem>

    <dl id="ld197"></dl>

    <track id="ld197"><big id="ld197"><big id="ld197"></big></big></track><noframes id="ld197"><dfn id="ld197"><address id="ld197"></address></dfn>

    <output id="ld197"></output>
    <var id="ld197"><noframes id="ld197">
      <dfn id="ld197"><nobr id="ld197"><sub id="ld197"></sub></nobr></dfn>
          <b id="ld197"><form id="ld197"><delect id="ld197"></delect></form></b>

                當前位置:首頁 > 安卓源碼 > 技術博客 >

                如何在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上禁用大容量警告消息 轉載http://www.hxslwl.com/appboke/46140.html

                技術博客閱讀排行

                最新文章

                久久人人97超碰人人澡,久久人人97超碰人人澡苹果,久久人人97超碰,国产福利第一视频在线播放,大陆国产国语对白视频,亚洲香蕉网久久综合影院