是否可以在下拉通知面板时暂停Android中的任何视频(媒体播放器)APP?
Is it possible to pause any video (mediaplayer) APP in Android when pull down the notification panel?
假设我有AOSP源码,如何在下拉通知面板时暂停APP在前台?我搜索了一下,发现一个APP可以监听事件onWindowFocusChange
并主动采取一些行动,但是如何在下拉通知面板时暂停任何 APP,而不修改每个分别是APP(这是不切实际的)?
有什么方法可以从SystemUI进程中调用任何前台应用程序的onPause
函数吗?
假设 Android 设备使用默认值 MediaPlayer, according to this state diagram,您可以使用本机pause
和 stop
状态。
如果您只想停止声音,您可以使用 VolumeAutomation ?
来改变音量
您可以使用以下方法检测通知面板拉动,
在您的清单文件中
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
在您的 activity 中覆盖 onWindowFocusChanged()
并编写以下代码。
这使用权限
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
try
{
if(!hasFocus)
{
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = statusbarManager.getMethod("collapse");
collapse .setAccessible(true);
collapse .invoke(service);
}
}
catch(Exception ex)
{
if(!hasFocus)
{
try {
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = statusbarManager.getMethod("collapse");
collapse .setAccessible(true);
collapse .invoke(service);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ex.printStackTrace();
}
}
}
然后在您的应用请求音频焦点时,参考下面link
https://developer.android.com/guide/topics/media-apps/audio-focus#java
这将暂停所有其他应用程序的音频访问。
解决方案分为两部分
- 正在检测通知面板拉动
- 暂停任何媒体播放应用程序
要检测通知面板拉动,您可以使用 Lalith or same code here 建议的方法。
In your manifest file
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
In your activity override the onWindowFocusChanged() and write the below code.
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
try
{
if(!hasFocus)
{
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = statusbarManager.getMethod("collapse");
collapse .setAccessible(true);
collapse .invoke(service);
}
}
catch(Exception ex)
{
if(!hasFocus)
{
try {
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = statusbarManager.getMethod("collapse");
collapse .setAccessible(true);
collapse .invoke(service);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ex.printStackTrace();
}
}
}
对于第二部分,所有精心设计的媒体播放器都实现了 Audio Focus Change Listeners。因此,要暂停所有媒体播放器应用程序,您可以请求临时或完全音频焦点,具体取决于您是否想让应用程序在通知面板折叠后立即再次播放。
使用以下内容
AudioManager audioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
// replace AUDIOFOCUS_GAIN with AUDIOFOCUS_GAIN_TRANSIENT if you want to pause and again resume when notification panel collapsed
.setAudioAttributes(playbackAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(afChangeListener, handler)
.build();
// to requestAudioFocus and pause other media apps
audioManager.requestAudioFocus(focusRequest);
// to resume again in case you requested AUDIOFOCUS_GAIN_TRANSIENT
audioManager.abandonAudioFocus(afChangeListener);
不要忘记实现 AudioFocusChangeListener
AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
// leave this empty if you don't need to handle audio focus for your app
}
};
Is there a way that I can call the onPause function of any foreground App from the SystemUI process?
据我研究,系统 ui 进程无法访问。但是,您可以启动具有透明主题 的activity。
在您的清单中
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
see this 而且我也亲自测试过创建透明 activity.
这意味着现在上面的activity是你的透明activity,另一个activity的onPause方法自然会被调用。折叠通知面板后,您可以销毁此 activity。并且为了安全起见,您还可以通过创建一个空视图来设置 onTouch 侦听器,该视图感觉应该破坏 activity onTouch 的屏幕。
假设我有AOSP源码,如何在下拉通知面板时暂停APP在前台?我搜索了一下,发现一个APP可以监听事件onWindowFocusChange
并主动采取一些行动,但是如何在下拉通知面板时暂停任何 APP,而不修改每个分别是APP(这是不切实际的)?
有什么方法可以从SystemUI进程中调用任何前台应用程序的onPause
函数吗?
假设 Android 设备使用默认值 MediaPlayer, according to this state diagram,您可以使用本机pause
和 stop
状态。
如果您只想停止声音,您可以使用 VolumeAutomation ?
来改变音量您可以使用以下方法检测通知面板拉动,
在您的清单文件中
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
在您的 activity 中覆盖 onWindowFocusChanged()
并编写以下代码。
这使用权限
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
try
{
if(!hasFocus)
{
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = statusbarManager.getMethod("collapse");
collapse .setAccessible(true);
collapse .invoke(service);
}
}
catch(Exception ex)
{
if(!hasFocus)
{
try {
Object service = getSystemService("statusbar");
Class<?> statusbarManager = Class.forName("android.app.StatusBarManager");
Method collapse = statusbarManager.getMethod("collapse");
collapse .setAccessible(true);
collapse .invoke(service);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ex.printStackTrace();
}
}
}
然后在您的应用请求音频焦点时,参考下面link
https://developer.android.com/guide/topics/media-apps/audio-focus#java
这将暂停所有其他应用程序的音频访问。
解决方案分为两部分
- 正在检测通知面板拉动
- 暂停任何媒体播放应用程序
要检测通知面板拉动,您可以使用 Lalith
In your manifest file
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
In your activity override the onWindowFocusChanged() and write the below code.
@Override public void onWindowFocusChanged(boolean hasFocus) { try { if(!hasFocus) { Object service = getSystemService("statusbar"); Class<?> statusbarManager = Class.forName("android.app.StatusBarManager"); Method collapse = statusbarManager.getMethod("collapse"); collapse .setAccessible(true); collapse .invoke(service); } } catch(Exception ex) { if(!hasFocus) { try { Object service = getSystemService("statusbar"); Class<?> statusbarManager = Class.forName("android.app.StatusBarManager"); Method collapse = statusbarManager.getMethod("collapse"); collapse .setAccessible(true); collapse .invoke(service); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } ex.printStackTrace(); } } }
对于第二部分,所有精心设计的媒体播放器都实现了 Audio Focus Change Listeners。因此,要暂停所有媒体播放器应用程序,您可以请求临时或完全音频焦点,具体取决于您是否想让应用程序在通知面板折叠后立即再次播放。
使用以下内容
AudioManager audioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE);
playbackAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_GAME)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();
focusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
// replace AUDIOFOCUS_GAIN with AUDIOFOCUS_GAIN_TRANSIENT if you want to pause and again resume when notification panel collapsed
.setAudioAttributes(playbackAttributes)
.setAcceptsDelayedFocusGain(true)
.setOnAudioFocusChangeListener(afChangeListener, handler)
.build();
// to requestAudioFocus and pause other media apps
audioManager.requestAudioFocus(focusRequest);
// to resume again in case you requested AUDIOFOCUS_GAIN_TRANSIENT
audioManager.abandonAudioFocus(afChangeListener);
不要忘记实现 AudioFocusChangeListener
AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
// leave this empty if you don't need to handle audio focus for your app
}
};
Is there a way that I can call the onPause function of any foreground App from the SystemUI process?
据我研究,系统 ui 进程无法访问。但是,您可以启动具有透明主题 的activity。
在您的清单中
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
see this 而且我也亲自测试过创建透明 activity.
这意味着现在上面的activity是你的透明activity,另一个activity的onPause方法自然会被调用。折叠通知面板后,您可以销毁此 activity。并且为了安全起见,您还可以通过创建一个空视图来设置 onTouch 侦听器,该视图感觉应该破坏 activity onTouch 的屏幕。