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

标签 android android-jetpack onkeydown

当我按下任一音量硬件按钮时,Android 系统 Android Volume如图所示。当我按下我的应用程序时,自然也会发生这种情况。
是否可以配置这些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)
        }
    }
}
streamVolume 执行 不是 增加好。
不幸的是,当我连续按下 Volume_up 时,'getStreamVolume()' 值保持为 t 1

最佳答案

音量对话框
对于音量,很容易用自定义对话框替换音量对话框,从 android-hide-volume-change-bar-from-device 你可以用简单的东西来替换它,比如你的 Activity 中的进度条,因为 Android 为它提供了一个接口(interface)。
通知对话框
您还可以(如果您非常有动力)为传入的通知自定义显示。您将需要一个实现 NotificationListenerService 的服务运行,它必须拦截通知,并将它们发送到主 Activity 以按照您想要的方式显示它们。
其他对话框
其他的,例如电源菜单,由于明显的原因不会改变。
结论
没有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> 
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));
    }
}
编辑
有人说原来的音量条仍然可见。
我直接尝试了我在S10 Android 10(三星框架)上提供的代码,默认音量条不可见。因此,我还在运行 LineageOS 10 的 S4 上进行了尝试,结果相同。没有音量条出现。
关于 adjustStreamVolumeadjustVolume 它们都允许您更改音量 channel ,但 adjustStreamVolume 允许您更改特定的 channel ,例如媒体、通话等。在我的示例中,它只是编辑媒体。

关于android - 应用程序中的 Android 系统小部件是否可配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64552085/

相关文章:

java - 线程中的方法调用给出 "Can' t 在线程内创建处理程序“异常

android - Unresolved reference : viewModelScope

android - 在 nestedscrollview 中使用时的分页库加载所有数据

android - onKeyListener 在虚拟键盘上不起作用

java - 使用新常量会破坏我的 Android 应用程序吗?

android - 自恢复出厂设置 android 以来的时间

android - 在循环 Recyclerview android 中捕捉中心 onItemClick

android - Jetpack Compose 在 Image 组件上添加可点击修饰符会更改布局

android - fragment Activity 捕获 onKeyDown 并在 fragment 中使用

android - AutoCompleteTextView 检测何时从用户编辑的列表中选择条目