Apakah mungkin untuk menjeda aplikasi video (mediaplayer) apa pun di Android saat menarik turun panel notifikasi?

11

Asumsikan saya memiliki kode sumber AOSP, Bagaimana saya bisa menjeda APP di latar depan ketika menarik panel notifikasi? Saya telah mencari di Google dan menemukan aplikasi yang dapat mendengarkan acara onWindowFocusChangedan mengambil tindakan secara proaktif, tetapi bagaimana saya bisa menjeda APLIKASI APAPUN ketika menarik ke bawah panel notifikasi, tanpa memodifikasi setiap aplikasi masing-masing (yang tidak praktis)?

Apakah ada cara agar saya dapat memanggil onPausefungsi aplikasi latar depan apa pun dari proses SystemUI?

zhangxaochen
sumber
menambahkan jawaban untuk semua pertanyaan Anda, lihat ini - stackoverflow.com/a/59589825/9640177
mayank1513
Key meluncurkan aktivitas transparan ketika notifikasi ditarik ke bawah. Ini akan memanggil metode onPause dari aktivitas saat ini. sedangkan meminta fokus akan menyebabkan pemutaran media berhenti
mayank1513

Jawaban:

10

Anda dapat menggunakan metode di bawah ini untuk mendeteksi tarikan panel notifikasi,

Di file manifes Anda

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

Dalam aktivitas Anda, timpa onWindowFocusChanged()dan tulis kode di bawah ini.

Ini menggunakan izin

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

Kemudian dalam permintaan aplikasi Anda untuk fokus audio, lihat tautan di bawah ini

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

Ini akan menjeda akses audio untuk semua aplikasi lain.

Akash Dubey
sumber
1
Karunia @zhangxaochen berakhir dalam 5 jam, Anda sudah kehilangannya dan, jika kadaluarsa, ia sia-sia !!
Akash Dubey
3

Ada dua bagian dari solusinya

  1. mendeteksi tarikan panel notifikasi
  2. menjeda aplikasi media yang sedang diputar

Untuk mendeteksi penarikan panel notifikasi, Anda dapat menggunakan metode yang disarankan oleh Akash atau kode yang sama di sini oleh Lalith.

Di file manifes Anda

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

Dalam aktivitas Anda menimpa onWindowFocusChanged () dan menulis kode di bawah ini.

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

Untuk bagian kedua, semua pemutar media yang dirancang dengan baik mengimplementasikan Pendengar Perubahan Fokus Audio. Dengan demikian untuk menjeda semua aplikasi pemutar media, Anda dapat meminta fokus audio sementara atau penuh tergantung pada apakah Anda ingin membiarkan aplikasi tersebut diputar kembali segera setelah panel notifikasi diciutkan.

Gunakan mengikuti

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

Jangan lupa untuk mengimplementasikan 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
    }
};

Apakah ada cara saya dapat memanggil fungsi onPause dari setiap aplikasi latar depan dari proses SystemUI?

Sejauh yang saya telah meneliti sistem, proses ui tidak dapat diakses. Namun, Anda dapat meluncurkan aktivitas dengan tema transparan .

Dalam manifes Anda

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

lihat ini dan saya juga telah diuji secara pribadi membuat aktivitas transparan.

Ini berarti bahwa aktivitas di atas sekarang adalah aktivitas transparan Anda dan metode onPause dari aktivitas lain secara alami akan dipanggil. Setelah panel notifikasi diciutkan, Anda dapat menghancurkan aktivitas ini. Dan untuk berada di sisi aman Anda juga dapat mengatur pendengar onTouch dengan membuat tampilan kosong yang terasa layar yang seharusnya menghancurkan aktivitas onTouch.

mayank1513
sumber
3

Dengan asumsi bahwa perangkat Android menggunakan MediaPlayer default , menurut diagram keadaan ini , Anda dapat menggunakan asli pausedan stopnegara.

Jika Anda tidak ingin menghentikan suara, Anda mungkin dapat mengubah volume suara menggunakan VolumeAutomation ?

STEFANI
sumber