Có thể tạm dừng bất kỳ ứng dụng video (mediaplayer) nào trong Android khi kéo bảng thông báo xuống không?


11

Giả sử tôi có mã nguồn AOSP, Làm cách nào tôi có thể tạm dừng APP ở nền trước khi kéo bảng thông báo xuống? Tôi đã googled và tìm thấy một APP có thể lắng nghe sự kiện onWindowFocusChangevà chủ động thực hiện một số hành động, nhưng làm cách nào tôi có thể tạm dừng BẤT K APP APP nào khi kéo bảng thông báo xuống mà không sửa đổi mọi APP tương ứng (không thực tế)?

Có cách nào để tôi có thể gọi onPausechức năng của bất kỳ Ứng dụng nền nào từ quy trình SystemUI không?


thêm câu trả lời cho tất cả các câu hỏi của bạn xem điều này - stackoverflow.com/a/59589825/9640177
mayank1513

Key đang khởi chạy hoạt động minh bạch khi thông báo được kéo xuống. Điều này sẽ gọi phương thức onPause của hoạt động hiện tại. trong khi yêu cầu tập trung sẽ khiến phát lại phương tiện tạm dừng
mayank1513

Câu trả lời:


10

Bạn có thể sử dụng phương pháp dưới đây để phát hiện kéo bảng thông báo,

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 đè lên onWindowFocusChanged() và viết mã dưới đây.

Điều này sử dụng sự cho phép

@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();
        }
    }
}

Sau đó, trong yêu cầu ứng dụng của bạn để tập trung âm thanh, hãy tham khảo liên kết dưới đây

https://developer.android.com/guide/topics/media-apps/audio-f Focus # java

Điều này sẽ tạm dừng truy cập âm thanh cho tất cả các ứng dụng khác.


1
Tiền thưởng @zhangxaochen sắp hết hạn sau 5 giờ, bạn đã mất nó và nếu nó hết hạn, nó đã bị lãng phí !!
Akash Dubey

3

Có hai phần cho giải pháp

  1. phát hiện kéo bảng thông báo
  2. 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.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.