Android Facebook Blokada ekranu powiadomienia

W najnowszej wersji aplikacji na Androida Facebook pokazał funkcję powiadamiania o zablokowaniu ekranu, jak na tym zrzucie ekranu:

zrzut ekranu

Czy ktoś próbował to zaimplementować?

Wiem, że wyświetlanie aktywności na ekranie blokady jest proste, ale niestety nie działa z półprzezroczystym tłem. Zasadniczo działa, ale poniżej naszej aktywności widzimy ekran launchera, a nie ekran blokady (jak ekran blokady w tym przypadku byłby również przezroczysty).

What I tried teraz jest:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
W mojej działalności.

Wypróbowałem również ten przykład: https://gist.github.com/daichan4649/5352944

I tak jak opisałem-wszystko działa, ale bez przejrzystości.

Z moich obserwacji Facebook używa tematu:

@android:style/Theme.Translucent.NoTitleBar

I nie ma uprawnień:

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

Zauważyłem również, że powiadomienie na ekranie blokady wymaga dotknięć, więc nie możemy wyświetlać powiadomień z paska stanu za pomocą gestu.

Wszelkie pomysły jak stworzyć tego rodzaju powiadomienie przed wydaniem Androida L.

Author: gre_gor, 2014-07-24

2 answers

Właściwie, ferdy182 był/jest na czymś.

Oto co mam za pomocą android.permission.SYSTEM_ALERT_WINDOW:

Tutaj wpisz opis obrazka

Więc nie mogłem tego zrobić Activity. To by nie zadziałało. Musiałem zaimplementować Service, który dodał View używając WindowManager.

Jednym z możliwych przepływów pracy byłoby: transmisja jest odbierana przez BroadcastReceiver = > uruchamia usługę => Usługa dodaje wymagany widok.

Teraz kod (komentarze wyjaśniają kilka rzeczy):

public class MyService extends Service {

    View mView;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        // instance of WindowManager
        WindowManager mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);

        LayoutInflater mInflater = (LayoutInflater) 
                                      getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        // inflate required layout file
        mView = mInflater.inflate(R.layout.abc, null);

        // attach OnClickListener
        mView.findViewById(R.id.some_id).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // you can fire an Intent accordingly - to deal with the click event
                // stop the service - this also removes `mView` from the window
                // because onDestroy() is called - that's where we remove `mView`
                stopSelf();
            }
        });

        // the LayoutParams for `mView`
        // main attraction here is `TYPE_SYSTEM_ERROR`
        // as you noted above, `TYPE_SYSTEM_ALERT` does not work on the lockscreen
        // `TYPE_SYSTEM_OVERLAY` works very well but is focusable - no click events
        // `TYPE_SYSTEM_ERROR` supports all these requirements
        WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT, 
            ViewGroup.LayoutParams.WRAP_CONTENT, 0, 0,
            WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                    | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                    | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, 
                      PixelFormat.RGBA_8888);

        // finally, add the view to window
        mWindowManager.addView(mView, mLayoutParams);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        // remove `mView` from the window
        removeViewFromWindow();
    }

    // Removes `mView` from the window
    public void removeNow() {
        if (mView != null) {
            WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
            wm.removeView(mView);
        }
    }
}

I na koniec dodaj uprawnienia do manifestu aplikacji:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
 17
Author: Vikram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-06 12:23:28

Myślę, że prawdopodobnie używa tej samej sztuczki, co Chat heads bubbles dla Messenger.

Zasadniczo używasz tego uprawnienia "android.pozwolenie.SYSTEM_ALERT_WINDOW" aby wyświetlać swoje widoki nad innymi aplikacjami.

Sam nie próbowałem, ale jestem prawie pewien, że tego użyli.

Z docs "Pozwala aplikacji na otwieranie okien przy użyciu typu TYPE_SYSTEM_ALERT, wyświetlanego na wierzchu wszystkich innych aplikacji. " http://developer.android.com/reference/android/Manifest.permission.html#SYSTEM_ALERT_WINDOW

 0
Author: Fernando Gallego,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 09:47:27