Bildirim panelini aşağı çekerken Android'de herhangi bir video (mediaplayer) uygulamasını duraklatmak mümkün mü?


11

AOSP kaynak kodum olduğunu varsayalım, Bildirim panelini aşağı çekerken APP'yi ön planda nasıl duraklatabilirim? Google'ı araştırdım ve bir etkinliği olayı dinleyip onWindowFocusChangeproaktif bir şekilde bazı işlemler yapabileceğini buldum, ancak bildirim panelini aşağı çekerken HERHANGİ BİR APP'yi sırasıyla her bir APP'yi (pratik olmayan) değiştirmeden nasıl duraklatabilirim ?

onPauseSystemUI işleminden herhangi bir ön plan App işlevini çağırabileceğiniz bir yolu var mı ?


tüm sorularınıza cevap ekledik bunu görün - stackoverflow.com/a/59589825/9640177
mayank1513

Bildirim aşağı çekildiğinde anahtar saydam etkinlik başlatmaktır. Bu, geçerli etkinliğin onPause yöntemini çağırır. odaklanma isteği medya oynatmanın duraklamasına neden olur
mayank1513

Yanıtlar:


10

Bildirim paneli çekmesini tespit etmek için aşağıdaki yöntemi kullanabilirsiniz,

Manifest dosyanızda

 <uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

Etkinliğinizde onWindowFocusChanged()aşağıdaki kodu geçersiz kılın ve yazın.

Bu izin kullanır

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

Ardından, uygulama için ses odağı isteğinizde aşağıdaki bağlantıya bakın

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

Bu, diğer tüm uygulamalar için ses erişimini duraklatacaktır.


1
@zhangxaochen lütuf süresi 5 saat içinde sona eriyor, zaten kaybettiniz ve süresi dolmuşsa, boşa gitti!
Akash Dubey

3

Çözümün iki parçası var

  1. bildirim paneli çekmesini algılama
  2. herhangi bir medya yürütme uygulamasını duraklatma

Bildirim panelinin çekildiğini tespit etmek için Akash tarafından önerilen yöntemi veya burada Lalith tarafından aynı kodu kullanabilirsiniz .

Manifest dosyanızda

<uses-permission android:name="android.permission.EXPAND_STATUS_BAR" />

Etkinliğinizde onWindowFocusChanged () öğesini geçersiz kılın ve aşağıdaki kodu yazın.

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

İkinci bölüm için tüm iyi tasarlanmış medya oynatıcılar Ses Odak Değişimi Dinleyicileri uygular. Bu nedenle, tüm medya oynatıcı uygulamalarını duraklatmak için, bildirim paneli çöktüğünde uygulamaların tekrar oynatılmasına izin vermek isteyip istemediğinize bağlı olarak geçici veya tam ses odaklaması isteyebilirsiniz.

Aşağıdakileri kullan

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'ı uygulamayı unutmayın

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
    }
};

SystemUI işleminden herhangi bir ön plan App onPause işlevini çağırabilirsiniz bir yolu var mı?

Bildiğim kadarıyla sistem ui sürecine erişilemiyor. Ancak, şeffaf temalı bir etkinlik başlatabilirsiniz .

Manifestinizde

<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />

Bunu görüyorum ve ayrıca şeffaf etkinlik oluşturmayı şahsen test ettim.

Bu, üstteki etkinliğin şeffaf etkinliğiniz olduğu ve diğer etkinliğin onPause yönteminin doğal olarak çağrılacağı anlamına gelir. Bildirim paneli daraltıldıktan sonra bu etkinliği yok edebilirsiniz. Ve güvenli tarafta olmak için, ekranı TouchTo etkinliğini yok etmesi gereken boş bir görünüm oluşturarak onTouch dinleyicisini de ayarlayabilirsiniz.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.