对于这个问题,我将引用另一个对他们的问题没有回应的用户:
我编写了一个Andoid应用程序,它将硬件音量按钮用于其他目的.
如果应用程序运行且可见,它可以正常工作,但是当我关闭屏幕或让它超时时,按钮单击不会进入我的处理程序.
有人知道屏幕关闭时是否有办法检测这些按钮点击?来源:AV695的问题
我正在使用一个使用音量按钮的应用程序,但正如该用户也注意到的那样,一旦屏幕关闭,使用onKeyPress检查按钮的正常行为就会停止工作.这是因为活动在屏幕上暂停了.
有没有办法在屏幕关闭时保持活动运行,或者在屏幕关闭时检查音量按钮的使用情况?我之前尝试过使用服务,但是不可能检查Commonsware所指出的音量键.
有没有办法在Android上收听音量变化事件,而不仅仅是接管音量按钮?
我发现唯一有效的方法就在这里,但只有在音量控制消失后才有效.
并非所有设备都有音量按钮,我需要在音量发生变化时立即捕捉它们,而不是在音量对话框消失后.
我正在尝试编写一个应用程序,它将在应用程序进入时按下音量增大/减小以及蓝牙耳机按钮
前两点我写了一些测试应用程序,一切都在我的情况下工作,我将应用程序发送到后台并按下音量上/下我的应用程序捕获此事件.按下电源按钮后,我的手机进入睡眠模式.然后我按下音量上/下按钮手机不响应那个事件,我看不到logcat中的任何一个loge,就像一切都停止工作.
我认为这个问题无法解决,但我记得当音乐播放时按下音量增大/减小按钮时,Android标准媒体播放器会捕捉到此事件.我认为这个应用程序可以这样做,因为它是系统应用程序,但后来我下载Winpm播放器,它以相同的方式工作.当手机处于睡眠模式时,Winapm会捕获音量增大/减小事件.音乐播放器应用程序就是这样做
我想知道如何做到这一点?我如何编写一个简单的应用程序,它将按下音量增/减按钮.我当时是否需要播放一些音乐,或者我可以这样做?我的意思是Winamp和其他应用程序捕获该事件的主要原因可能是当时播放音乐.或许这个问题无法解决,如果无法解决,我想知道为什么?我需要一些争论,为什么它无法解决.
我已经测试了一些应用程序,结果如下,我编写了一个简单的应用程序,可以在后台和前台捕获音量上下按键,以及应用程序处于睡眠模式时.当应用程序在后台和forground中时,一切都很完美,我的测试应用程序捕获事件,但是当我按下电源按钮时它停止这样做,然后我按下媒体播放器上的start并开始播放一些音乐,按下电源按钮后再次按下音量,doun和我的应用程序统计捕捉音量上下按键.这意味着然后播放音乐,我的应用程序可以捕获那些事件,所以我的下一个问题是如何模拟像我的手机播放音乐?可能这是解决方案吗?
的Manifest.xml
<receiver android:name="com.vito.backgroundworker.VolumeBroadcast" android:enabled="true">
<intent-filter>
<action android:name="android.media.VOLUME_CHANGED_ACTION" />
</intent-filter>
</receiver>
<receiver android:name="RemoteControlReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)
MainActivity.java
public class MainActivity extends Activity {
private PowerManager.WakeLock wl;
//private BroadcastReceiver vol = new VolumeBroadcast();
private AudioManager mAudioManager;
private ComponentName mRemoteControlResponder;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNjfdhotDimScreen");
mAudioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
mRemoteControlResponder = new ComponentName(getPackageName(),
RemoteControlReceiver.class.getName()); …Run Code Online (Sandbox Code Playgroud) 我想注册一个广播接收器来处理VOLUME_CHANGED_ACTION事件,只为volume_voice流类型(我凭经验看是指数0的Settings.System.VOLUME_SETTINGS).
标签EXTRA_VOLUME_STREAM_TYPE是隐藏的,所以我使用了显式字符串"android.media.EXTRA_VOLUME_STREAM_TYPE".这一切都工作正常在Android 2.3.4(获得价值0为volume_voice如预期),但在2.3.5,这额外的保存价值10,这给出了一个ArrayIndexOutOfBoundsException上Settings.System.VOLUME_SETTINGS.此外,我看到volume_voice仍然是指数0在Settings.System.VOLUME_SETTINGS.
有没有更强大的处理方式VOLUME_CHANGED_ACTION为volume_voice流类型?
编辑或任何其他方式来做标题要求的?
寻找"最全面和兼容(即所有Android版本...)"方式来收听音量变化,我找到了两种不同的方法来处理这个问题:
哪种方法更可取?
为什么?
更新1:由于下面的评论,我发现onKeyDown()实际上接管了卷密钥,这可能不是一个完整的解决方案,因为其中一个帖子提到可以通过除硬件按钮之外的接口来更改卷(不是提到谷歌似乎正逐渐取消那些"接管"能力.
OTOH,android.media.VOLUME_CHANGED_ACTION是一个黑客,甚至没有记录.这可能意味着它将在Android 5左右停止工作 ......
更新2: registerMediaButtonEventReceiver根本不起作用!(对于音量硬件按钮,我只是尝试过).
其他见解?
android broadcastreceiver android-audiomanager android-broadcast
ContentObserver的文档对我来说并不清楚.在哪个线程上调用ContentObserver的onChange?
我检查过,它不是你创建观察者的线程.看起来它是发送通知的线程,但我没有找到有关它的文档.
当我按下音量硬件按钮之一时,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
我在我的一个应用程序中使用getRunningTask API来查找Foreground应用程序.自Lollipop以来,该API已被弃用.在此弃用之后,我更喜欢getRunningAppProcess API以及Importance_Foreground.我还从这个列表中排除了REASON_SERVICE和REASON_PROVIDER.我基于一个完美的逻辑过滤掉了系统应用程序.问题是,如果应用程序A在前台,我将应用程序B作为峰值.所以,这种方法目前值得怀疑.getRunningTask API还有其他替代方案吗?或者我在当前的方法中遗漏了任何简单的事情.请帮帮我们
我想听"自动旋转"配置更改,而不是设备/系统方向,但是切换更改(打开/关闭)
我相信我必须在AndroidManifest中注册configChange并在任何我想要的地方创建一个监听器但我不确定什么是正确的配置.IE
android:configChanges='??'
Run Code Online (Sandbox Code Playgroud)
但也许存在另一种方式,而不是通过android:configChanges......
我想检测后台服务或Android中的本机环境中的音量按钮单击事件.我希望它可以随时检测到该事件.
我尝试了下面的代码ContentObserver,但这只能检测到AUDIO_SERVICE更改的事件,如果前台应用程序正在运行音乐,这种方法无法检测到它,我想因为它STREAM_MUSIC不是.AUDIO_SERVICE我想要的是随时检测音量按钮点击和任何音量按钮单击.
有谁知道怎么做?我可以用本机代码中的C实现它吗?
public class SettingsContentObserver extends ContentObserver {
int previousVolume;
Context context;
public SettingsContentObserver(Context c, Handler handler) {
super(handler);
context=c;
AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
previousVolume = audio.getStreamVolume(AudioManager.AUDIO_SERVICE);
}
@Override
public boolean deliverSelfNotifications() {
return super.deliverSelfNotifications();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
AudioManager audio = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audio.getStreamVolume(AudioManager.AUDIO_SERVICE);
int delta=previousVolume-currentVolume;
if(delta>0)
{
Logger.d("Volume Up!");
previousVolume=currentVolume;
}
else if(delta<0)
{
Logger.d("Volume Down!");
previousVolume=currentVolume;
}
}
} …Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,只要按下硬件音量按钮,就可以监听音量事件。应用可以在前景或背景中。我已经遵循[this](是否有广播操作来更改音量?),但无法正常工作。我面临的以下问题
1)如果我按一次音量按钮-事件被触发4-6次。
2)如果当前音量最大并且我增加音量,则事件不会触发。
请帮我。
有人可以给我一段代码,可以使用Android内容观察器来检测铃声音量的变化并记录下来吗?