Có hai phần cho giải pháp
- phát hiện kéo bảng thông báo
- tạm dừng bất kỳ ứng dụng chơi phương tiện truyền thông
Để phát hiện kéo bảng thông báo, bạn có thể sử dụng phương pháp được đề xuất bởi Akash hoặc cùng mã ở đây bởi Lalith.
Trong tệp kê khai của bạn
<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />
Trong hoạt động của bạn, ghi đè onWindowF FocusChanged () và viết mã dưới đây.
@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();
}
}
}
Đối với phần thứ hai, tất cả các trình phát phương tiện được thiết kế tốt đều thực hiện Trình nghe Thay đổi Tiêu điểm Âm thanh. Do đó, để tạm dừng tất cả các ứng dụng trình phát đa phương tiện, bạn có thể yêu cầu tập trung âm thanh tạm thời hoặc toàn bộ tùy thuộc vào việc bạn muốn cho các ứng dụng phát lại ngay sau khi bảng thông báo bị sập.
Sử dụng sau đây
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);
Đừng quên triển khai AudioF FocusChangeListener
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
}
};
Có cách nào để tôi có thể gọi hàm onPause của bất kỳ Ứng dụng nền nào từ quy trình SystemUI không?
Theo như tôi đã nghiên cứu hệ thống ui thì không thể truy cập được. Tuy nhiên, bạn có thể khởi chạy một hoạt động với chủ đề minh bạch .
Trong bảng kê khai của bạn
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
thấy điều này và cá nhân tôi cũng đã thử nghiệm tạo ra hoạt động minh bạch.
Điều này có nghĩa là hoạt động trên cùng bây giờ là hoạt động minh bạch của bạn và phương thức onPause của hoạt động khác sẽ tự nhiên được gọi. Khi bảng thông báo bị sập, bạn có thể hủy hoạt động này. Và để an toàn, bạn cũng có thể thiết lập trình nghe onTouch bằng cách tạo chế độ xem trống cảm thấy màn hình sẽ phá hủy hoạt động trênTouch.