AOSPソースコードがあると仮定します。通知パネルをプルダウンするときに、アプリをフォアグラウンドで一時停止するにはどうすればよいですか?アプリをググってみて、イベントonWindowFocusChange
をリッスンしてプロアクティブにアクションを実行できることを確認しましたが、通知パネルをプルダウンするときに、すべてのアプリを個別に変更せずにアプリを一時停止するにはどうすればよいですか?
onPause
SystemUIプロセスからフォアグラウンドアプリの関数を呼び出す方法はありますか?
AOSPソースコードがあると仮定します。通知パネルをプルダウンするときに、アプリをフォアグラウンドで一時停止するにはどうすればよいですか?アプリをググってみて、イベントonWindowFocusChange
をリッスンしてプロアクティブにアクションを実行できることを確認しましたが、通知パネルをプルダウンするときに、すべてのアプリを個別に変更せずにアプリを一時停止するにはどうすればよいですか?
onPause
SystemUIプロセスからフォアグラウンドアプリの関数を呼び出す方法はありますか?
回答:
通知パネルのプルを検出するには、以下の方法を使用できます。
マニフェストファイル
<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
これにより、他のすべてのアプリのオーディオアクセスが一時停止されます。
ソリューションには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のアクティビティを破棄する必要がある画面を感じる空のビューを作成することによって行います。
Android デバイスがデフォルトの MediaPlayerを使用していると仮定すると、この状態図に従って、ネイティブpause
とstop
状態を使用できます。
音を止めたくないだけなら、VolumeAutomation?