应用程序中的 Android 系统小部件是否可配置?

Edn*_*pel 7 android onkeydown android-jetpack

当我按下音量硬件按钮之一时,Android 的系统 安卓音量显示了一个描绘。当然,当我按下我的应用程序时也会发生这种情况。

是否可以配置这些Android系统的风格,比如音量?或者至少当我在我的应用程序中打开这些系统内容时?

编辑:正如评论中所建议的,我已经覆盖了onKeyDown,但 adjustStreamVolume 仅在 0 和 1 之间切换。

override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
    when (event?.keyCode) {
        KeyEvent.KEYCODE_VOLUME_UP -> {
            audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_RAISE, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE)
            return true
        }
        KeyEvent.KEYCODE_VOLUME_DOWN -> {
            audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE)
            return true
        }
        else -> {
            return super.onKeyDown(keyCode, event)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

streamVolume 没有很好地增加。不幸的是,当我连续按下 Volume_up 时,'getStreamVolume()' 值仍然是 t 1

axe*_*083 2

音量对话框

对于音量,用自定义的音量对话框替换音量对话框非常容易,从android-hide-volume-change-bar-from-device 中,您可以将其替换为简单的东西,例如 Activity 中的进度条,因为 Android 提供了它的一个接口。

通知对话框

您还可以(如果您非常积极的话)为传入通知设置自定义显示。您需要运行一个实现NotificationListenerService的服务,它必须拦截通知,并将它们发送到主活动以按照您想要的方式显示它们。

其他对话框

其他的,例如电源菜单,由于显而易见的原因将不会改变。

结论

没有root权限是无法修改android系统的样式的,因为它是编码在系统app里的。

Android 为您提供了不同的方式来更改其行为,但它有其局限性。

以下是卷的示例:

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ProgressBar
        android:id="@+id/progress_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"/>

</androidx.constraintlayout.widget.ConstraintLayout> 
Run Code Online (Sandbox Code Playgroud)

MainActivity.java

public class MainActivity extends AppCompatActivity {

    AudioManager manager;
    ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        manager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        progressBar = findViewById(R.id.progress_horizontal);
        updateVolume();
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (event.getKeyCode()) {
            case KeyEvent.KEYCODE_VOLUME_UP:
                updateVolume();
                manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_RAISE,
                        AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
                return true;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                updateVolume();
                manager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
                        AudioManager.ADJUST_LOWER,
                        AudioManager.FLAG_REMOVE_SOUND_AND_VIBRATE);
                return true;

            default:
                return super.onKeyDown(keyCode, event);
        }
    }

    private void updateVolume()
    {
        int currentVolume = manager.getStreamVolume(AudioManager.STREAM_MUSIC);
        int maxVolume = manager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

        progressBar.setProgress((int) ((float) currentVolume/maxVolume*100));
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

有人说原来的音量条仍然可见。我直接在我的S10 Android 10(三星框架)上尝试了我提供的代码,默认音量条不可见。因此我也在运行 LineageOS 10 的 S4 上进行了尝试,结果相同。没有出现音量条。

关于调整流卷调整卷,它们都允许您更改音量频道,但adjustStreamVolume允许您更改特定频道,例如媒体、通话等。在我的示例中,它仅编辑媒体。