问题描述
当我按下音量硬件按钮之一时,将显示Android系统。当然,当我在应用程序中按whith时,也会发生这种情况。
是否可以配置这些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中的自定义对话框替换卷对话框非常容易,您可以用简单的东西(例如活动中的进度条)替换它,因为Android提供了它的界面。
通知对话框
您也可以(如果很有动力)为传入的通知创建自定义显示。您将需要运行一个实现NotificationListenerService的服务,它必须拦截通知,然后将其发送到主要活动中以所需的方式显示它们。
其他对话框
其他功能(例如电源菜单)由于明显原因将无法更改。
结论
未经root许可,您无法修改android系统的样式,因为它是在系统应用中编码的。
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上进行了尝试,结果相同。没有音量栏出现。
关于adjustStreamVolume或adjustVolume,它们都允许您更改音量通道,而adjustStreamVolume
则允许您更改特定的通道,例如媒体,通话等。在我的示例中,仅在编辑媒体。
在应用程序级别是,您可以执行任何操作,因为每个动作都有一个事件,您可以根据自己选择的事件使用自己选择的UI创建自己的动作,例如隐藏 STOCK VOLUME DIALOG
并显示 CUSTOM DIALOG
,但是在操作系统级别上没有,您无法这样做。
原因
Android框架和其他任何架构组件都可以在 事件的基础知识,例如在Android OS中,如果您做某事,事件就是 初始化并将广播发送到所有框架,并且可以 由具有 PERMISSIONS 和 IDS 权限的任何应用程序读取 在特殊通知的情况下,使用广播接收者和服务 广播。
您如何实现目标
我不会告诉您要执行的所有功能和方法 但会在以下帮助下告诉您实现该目标的方法 Andoird的官方DOC ,并与Stackoverflow上的杰出人士
对于所有事件,您都可以使用此替代方法
@Override
public boolean onKey**`YourKeyEvent`**(int keyCode,KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.Your_Event_One:
//your actions (perform code on some keyEvent)
break;
case KeyEvent.Your_Event_Two:
//your actions (perform code on some keyEvent)
break;
}
}
上面的代码对于大多数事件来说非常有用,但对于某些事件,您还需要广播接收者
LIST OF KEY_EVENTS (Android's Docs)
List Of Key Codes (Android's Code)
编辑 要更改音量,请查看 This 帖子,通过使用此帖子,您可以在音量摇杆操作上创建回调,然后使用主屏幕上的服务隐藏股票对话框,并显示自己的对话框。
注意:过去我从未接触过库存UI组件,所以我不确定那部分。