เป็นไปได้หรือไม่ที่จะหยุดวิดีโอ (mediaplayer) APP ใน Android ชั่วคราวเมื่อดึงแผงการแจ้งเตือนลงมา?


11

สมมติว่าฉันมีซอร์สโค้ด AOSP ฉันจะหยุดแอปในเบื้องหน้าเมื่อดึงแผงการแจ้งเตือนได้อย่างไร ฉันได้ค้นหาและค้นหาแอปแล้วสามารถฟังเหตุการณ์onWindowFocusChangeและดำเนินการเชิงรุกได้ แต่ฉันจะหยุดแอพใด ๆ ได้อย่างไรเมื่อดึงแผงการแจ้งเตือนลงมาโดยไม่ต้องแก้ไขแอปทุกตัวตามลำดับ

มีวิธีที่ฉันสามารถเรียกใช้onPauseฟังก์ชั่นของแอปเบื้องหน้าใด ๆ จากกระบวนการ SystemUI หรือไม่?


เพิ่มคำตอบสำหรับคำถามของคุณทั้งหมดแล้ว - stackoverflow.com/a/59589825/9640177
mayank1513

รหัสกำลังเปิดตัวกิจกรรมที่โปร่งใสเมื่อการแจ้งเตือนถูกดึงลงมา สิ่งนี้จะเรียกใช้เมธอด onPause ของกิจกรรมปัจจุบัน ในขณะที่การขอโฟกัสจะทำให้การเล่นสื่อหยุดชั่วคราว
mayank1513

คำตอบ:


10

คุณสามารถใช้วิธีการด้านล่างเพื่อตรวจจับการดึงแผงการแจ้งเตือน

ในไฟล์ 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();
        }
    }
}

จากนั้นในคำขอแอปของคุณสำหรับโฟกัสเสียงอ้างอิงลิงค์ด้านล่าง

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

นี่จะเป็นการหยุดการเข้าถึงเสียงชั่วคราวสำหรับแอพอื่นทั้งหมด


1
@zhangxaochen bounty กำลังจะหมดอายุใน 5 ชั่วโมงคุณสูญเสียไปแล้วและถ้ามันหมดอายุมันก็สูญเปล่าไปแล้ว !!
Akash Dubey

3

การแก้ปัญหามีสองส่วน

  1. ตรวจจับการดึงแผงการแจ้งเตือน
  2. หยุดแอปสื่อที่กำลังเล่นชั่วคราว

สำหรับการตรวจสอบดึงแผงแจ้งเตือนที่คุณอาจใช้วิธีการที่แนะนำโดย 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 ของกิจกรรมอื่น ๆ จะถูกเรียกตามธรรมชาติ เมื่อแผงการแจ้งเตือนถูกยุบคุณสามารถทำลายกิจกรรมนี้ได้ และเพื่อให้อยู่ในด้านที่ปลอดภัยคุณยังสามารถตั้งให้ผู้ฟังสัมผัสได้ด้วยการสร้างมุมมองว่างเปล่าที่รู้สึกถึงหน้าจอที่ควรทำลายกิจกรรมบนทัช


3

สมมติว่าอุปกรณ์ Android ใช้MediaPlayer เริ่มต้นตามแผนภาพสถานะนี้คุณสามารถใช้เนทีฟpauseและstopสถานะ

หากคุณ wan't เดียวที่จะหยุดเสียงคุณอาจอาจมีการเปลี่ยนแปลงระดับเสียงโดยใช้VolumeAutomation ?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.