问题
Assume I have the AOSP source code, How can I pause the APP in the foreground when pulling down the notification panel? I've googled and find an APP can listen the event onWindowFocusChange
and take some action proactively, but how can I pause ANY APP when pulling down the notification panel, without modify every APP respectively (which is impractical)?
Is there a way that I can call the onPause
function of any foreground App from the SystemUI process?
回答1:
Assuming that the Android device use the default MediaPlayer, according to this state diagram, you may use the native pause
and stop
state.
If the player is not default player you can't ! The only way is to interact individually with each "potential" app to pause media (and in my opinion it is absolutely not sure that apps will allow you to change their media playing status ...)
If you only wan't to stop sound, you may probably change the sound volume using a VolumeAutomation ?
回答2:
You can use below method for detecting the notification panel pull,
In your manifest file
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
In your activity override the onWindowFocusChanged()
and write the below code.
This uses the permission
@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();
}
}
}
Then in your app request for audio focus, refer below link
https://developer.android.com/guide/topics/media-apps/audio-focus#java
This will pause audio access for all other apps.
回答3:
There are two parts to the solution
- detecting notification panel pull
- pausing any media playing app
For detecting notification panel pull you may employ the method suggested by Akash.
For the second part all well designed media players implement Audio Focus Change Listeners. Thus to pause all media player apps you can request temporary or full audio focus depending on whether you want to let the apps play again as soon as notification panel is collapsed.
Use following
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);
Don't forget to implement 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
}
};
来源:https://stackoverflow.com/questions/59524839/is-it-possible-to-pause-any-video-mediaplayer-app-in-android-when-pull-down-th