通知パネルをプルダウンすると、Androidのビデオ(メディアプレイヤー)アプリを一時停止できますか?


11

AOSPソースコードがあると仮定します。通知パネルをプルダウンするときに、アプリをフォアグラウンドで一時停止するにはどうすればよいですか?アプリをググってみて、イベントonWindowFocusChangeをリッスンしてプロアクティブにアクションを実行できることを確認しましたが、通知パネルをプルダウンするときに、すべてのアプリを個別に変更せずにアプリを一時停止するにはどうすればよいですか?

onPauseSystemUIプロセスからフォアグラウンドアプリの関数を呼び出す方法はありますか?


すべてのご質問の答えを追加、これを見る- stackoverflow.com/a/59589825/9640177
mayank1513

通知がプルダウンされると、キーは透過的なアクティビティを起動します。これにより、現在のアクティビティのonPauseメソッドが呼び出されます。一方、フォーカスを要求すると、メディアの再生が一時停止します
mayank1513

回答:


10

通知パネルのプルを検出するには、以下の方法を使用できます。

マニフェストファイル

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

アクティビティでをオーバーライドし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();
        }
    }
}

次に、アプリのオーディオフォーカスのリクエストで、以下のリンクを参照してください

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

これにより、他のすべてのアプリのオーディオアクセスが一時停止されます。


1
@zhangxaochenバウンティは5時間で有効期限が切れます。すでに失われています。期限が切れると、無駄になります!!
Akash Dubey

3

ソリューションには2つの部分があります

  1. 通知パネルのプルの検出
  2. メディア再生アプリを一時停止する

通知パネルのプルを検出するには、Akashによって提案さた方法またはここでLalithによって同じコードを使用できます。

マニフェストファイル

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

アクティビティで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();
        }
    }
}

2番目の部分では、適切に設計されたすべてのメディアプレーヤーがオーディオフォーカス変更リスナーを実装します。したがって、すべてのメディアプレーヤーアプリを一時停止するには、通知パネルが折りたたまれたらすぐにアプリを再び再生するかどうかに応じて、一時的または完全なオーディオフォーカスを要求できます。

以下を使用

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

SystemUIプロセスからフォアグラウンドアプリのonPause関数を呼び出す方法はありますか?

私がシステムを調査した限り、UIプロセスにはアクセスできません。ただし、透明なテーマでアクティビティを起動できます。

あなたのマニフェストで

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

これ見て、私は個人的に透明なアクティビティを作成することもテストしました。

つまり、現在の最上位のアクティビティは透過的なアクティビティであり、他のアクティビティのonPauseメソッドが当然呼び出されます。通知パネルを折りたたむと、このアクティビティを破棄できます。安全のために、onTouchリスナーを設定することもできます。これは、onTouchのアクティビティを破棄する必要がある画面を感じる空のビューを作成することによって行います。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.