क्या अधिसूचना पैनल को नीचे खींचने पर Android में किसी भी वीडियो (मीडियाप्लेयर) को रोकना संभव है?


11

मान लें कि मेरे पास AOSP स्रोत कोड है, मैं अधिसूचना पैनल को नीचे खींचते समय एपीपी को अग्रभूमि में कैसे रोक सकता हूं? मैंने googled और पाया है कि एक APP ईवेंट को सुन सकता है onWindowFocusChangeऔर कुछ कार्रवाई सक्रिय रूप से कर सकता है, लेकिन अधिसूचना पैनल को नीचे खींचते समय मैं किसी भी एपीपी को कैसे रोक सकता हूं , बिना क्रमशः प्रत्येक एपीपी को संशोधित करें (जो अव्यावहारिक है)?

क्या कोई ऐसा तरीका है जिसे मैं onPauseSystemUI प्रक्रिया से किसी भी अग्रभूमि ऐप के फ़ंक्शन को कॉल कर सकता हूं ?


आपके सभी सवालों के जवाब में इसे देखें - stackoverflow.com/a/59589825/9640177
mayank1513

अधिसूचना को नीचे खींचने पर कुंजी पारदर्शी गतिविधि शुरू कर रही है। यह चालू गतिविधि की ऑनपॉज विधि को कॉल करेगा। फ़ोकस का अनुरोध करते समय मीडिया प्लेबैक को रोकने के लिए कारण होगा
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
@ झांझगाओचेन इनाम 5 घंटे में समाप्त हो रहा है, आप पहले से ही इसे खो चुके हैं और, अगर यह समाप्त हो गया, तो यह बर्बाद हो गया !!
आकाश दुबे

3

समाधान के दो भाग हैं

  1. अधिसूचना पैनल पुल का पता लगाना
  2. किसी भी मीडिया प्लेइंग ऐप को रोकना

अधिसूचना पैनल पुल का पता लगाने के लिए आप आकाश द्वारा सुझाई गई विधि या ललित द्वारा यहां एक ही कोड को नियोजित कर सकते हैं ।

अपनी मैनिफ़ेस्ट फ़ाइल में

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

दूसरे भाग के लिए सभी अच्छी तरह से डिज़ाइन किए गए मीडिया प्लेयर ऑडियो फोकस चेंज श्रोताओं को लागू करते हैं। इस प्रकार सभी मीडिया प्लेयर ऐप्स को रोकने के लिए आप अस्थायी या पूर्ण ऑडियो फ़ोकस का अनुरोध कर सकते हैं जो इस बात पर निर्भर करता है कि आप नोटिफिकेशन पैनल के गिरते ही ऐप्स को फिर से खेलना चाहते हैं या नहीं।

निम्नलिखित का उपयोग करें

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

क्या कोई ऐसा तरीका है जिसे मैं सिस्टमयूआई प्रक्रिया से किसी भी अग्रभूमि ऐप के ऑनपोज़ फ़ंक्शन को कॉल कर सकता हूं?

जहां तक ​​मैंने शोध प्रणाली यूआई प्रक्रिया सुलभ नहीं है। हालांकि, आप पारदर्शी विषय के साथ एक गतिविधि शुरू कर सकते हैं

आपके प्रकट में

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

इसे देखें और मैंने पारदर्शी गतिविधि बनाते हुए व्यक्तिगत रूप से परीक्षण किया है।

इसका मतलब है कि शीर्ष पर गतिविधि अब आपकी पारदर्शी गतिविधि है और अन्य गतिविधि का ऑनपॉज विधि स्वाभाविक रूप से कहा जाएगा। एक बार अधिसूचना पैनल ढह जाने पर आप इस गतिविधि को नष्ट कर सकते हैं। और सुरक्षित पक्ष पर रहने के लिए आप एक खाली दृश्य बनाकर ऑनटच श्रोता को सेट कर सकते हैं जो उस स्क्रीन को महसूस करता है जिसे गतिविधि को नष्ट करना चाहिए।


3

यह मानते हुए कि एंड्रॉइड डिवाइस डिफ़ॉल्ट MediaPlayer का उपयोग करता है , इस राज्य आरेख के अनुसार , आप मूल का उपयोग कर सकते हैंpause और stopराज्य का ।

यदि आप केवल ध्वनि को रोकना नहीं चाहते हैं, तो आप शायद वॉल्यूमअटोमेशन का उपयोग करके ध्वनि की मात्रा को बदल सकते हैं ?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.