การแก้ปัญหามีสองส่วน
- ตรวจจับการดึงแผงการแจ้งเตือน
- หยุดแอปสื่อที่กำลังเล่นชั่วคราว
สำหรับการตรวจสอบดึงแผงแจ้งเตือนที่คุณอาจใช้วิธีการที่แนะนำโดย Akashหรือรหัสเดียวกันที่นี่โดย Lalith
ในไฟล์ Manifest ของคุณ
<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();
}
}
}
สำหรับส่วนที่สองผู้เล่นสื่อที่ออกแบบมาอย่างดีจะใช้ Audio Focus Change Listeners ดังนั้นเพื่อหยุดแอปเครื่องเล่นสื่อทั้งหมดคุณสามารถขอโฟกัสเสียงชั่วคราวหรือเต็มรูปแบบขึ้นอยู่กับว่าคุณต้องการให้แอปเล่นอีกครั้งทันทีที่แผงการแจ้งเตือนถูกยุบ
ใช้ดังต่อไปนี้
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
}
};
มีวิธีที่ฉันสามารถเรียกใช้ฟังก์ชัน onPause ของแอปเบื้องหน้าใด ๆ จากกระบวนการ SystemUI หรือไม่
เท่าที่ฉันได้วิจัยกระบวนการ UI ของระบบไม่สามารถเข้าถึงได้ อย่างไรก็ตามคุณสามารถเปิดกิจกรรมที่มีรูปแบบโปร่งใส
ในรายการของคุณ
<activity android:name=".your.activity" android:theme="@android:style/Theme.Translucent.NoTitleBar" />
เห็นสิ่งนี้และฉันเองก็ได้ทำการทดสอบการสร้างกิจกรรมที่โปร่งใส
ซึ่งหมายความว่ากิจกรรมที่อยู่ด้านบนในขณะนี้คือกิจกรรมที่โปร่งใสของคุณและวิธีการ onPause ของกิจกรรมอื่น ๆ จะถูกเรียกตามธรรมชาติ เมื่อแผงการแจ้งเตือนถูกยุบคุณสามารถทำลายกิจกรรมนี้ได้ และเพื่อให้อยู่ในด้านที่ปลอดภัยคุณยังสามารถตั้งให้ผู้ฟังสัมผัสได้ด้วยการสร้างมุมมองว่างเปล่าที่รู้สึกถึงหน้าจอที่ควรทำลายกิจกรรมบนทัช