2013-06-04 12 views
13

Jak sprawdzić programowo, czy użytkownik wyłącza powiadomienia push w ustawieniach aplikacji? Czy mogę otworzyć intencję ustawień aplikacji bezpośrednio z aplikacji, aby zachęcić użytkownika do jej włączenia?Android - Powiadomienia push są włączone?

enter image description here

Dzięki

+0

O ile mi wiadomo, nie można wyłączyć te powiadomienia. Jeśli zaznaczysz [Powiadomienie] (https://developer.android.com/reference/android/app/Notification.html) i [NotificationManager] (https://developer.android.com/reference/android/app/NotificationManager. html) nie zobaczysz żadnej metody, która pozwala uzyskać te informacje. Mogę się mylić. – Akatosh

+0

Może http://stackoverflow.com/questions/4421527/start-android-application-info-screen może pomóc. – OcuS

+0

Czy to prawda, że ​​musisz odinstalować aplikację, jeśli nie chcesz już otrzymywać nowej wiadomości Push? – vikingsteve

Odpowiedz

8

Zakładając, że odnosząc się do Google Cloud Messaging (ponieważ używasz tag android i push-powiadomień), nie istnieją żadne ogólne ustawienia stosowane w celu włączenia/wyłączenia usługi GCM (w przeciwieństwie do usługi Apple Push Notifications dla urządzeń z systemem iOS).

Po zainstalowaniu aplikacji, jeśli aplikacja korzysta z Google Cloud Messaging, pojawi się na liście uprawnień wymaganych przez tę aplikację do działania. Decydując się na instalację aplikacji, zezwalasz jej na wysyłanie powiadomień push.

To powiedziawszy, aby aplikacja mogła odbierać wiadomości GCM, Twoja aplikacja musi zarejestrować się programowo w usłudze GCM. Możesz to zrobić w dowolnym miejscu w swojej aplikacji i możesz utworzyć aktywność (lub fragment), w której użytkownik może włączyć/wyłączyć GCM (co może spowodować rejestrację/wyrejestrowanie do/z GCM). Twoja aplikacja może zawierać trwały magazyn, w którym przechowywany jest identyfikator rejestracji, który otrzymasz po rejestracji w GCM, i możesz użyć tego sklepu, aby określić, czy Twoja aplikacja jest zarejestrowana w GCM.

Możesz poprosić użytkownika, aby go włączyć, jeśli aplikacja jest już uruchomiona (jeśli masz jakiś kod, który to robi). Jeśli nie działa, a aplikacja nie jest zarejestrowana dla GCM na tym urządzeniu, Twój serwer nie może wysyłać do niej komunikatów GCM.

Jeśli chcesz przezwyciężyć tę przeszkodę, możesz zarejestrować się w GCM automatycznie (po pierwszym uruchomieniu aplikacji). Następnie możesz wysyłać wiadomości do aplikacji, kiedy tylko chcesz. Jeśli nadal chcesz, aby użytkownik zdecydował, czy chce zobaczyć te powiadomienia, w ustawieniach aplikacji możesz ustawić flagę, która włącza/wyłącza powiadomienia interfejsu użytkownika utworzone w wyniku przychodzącej wiadomości GCM. Usługa GCM będzie zawsze włączona, ale jeśli użytkownik nie zdecyduje się wyświetlić powiadomień, aplikacja nie wyświetli niczego po otrzymaniu wiadomości GCM.

+2

Więc jeśli dobrze rozumiem, "pokaż powiadomienie" w ustawieniach aplikacji jest po prostu ukryć wszystkie "wyskakujące okienka" z aplikacji? Na przykład nadal mogę otrzymywać powiadomienia, przechowywać je i wyświetlać jako okno dialogowe, gdy użytkownik wchodzi do aplikacji. – goodm

+0

@goodm Nie jestem pewien, do których 'ustawień aplikacji' się odwołujesz. Czy odnosisz się do konkretnych "ustawień aplikacji" w konkretnej aplikacji? Jeśli odnosisz się do powiadomień przychodzących z usługi GCM, sam decydujesz, jak napisać aplikację (czy automatycznie zarejestrować się w GCM i zawsze pozostać zarejestrowanym, co pozwoli Ci zawsze otrzymywać powiadomienia). – Eran

+0

Według ustawień aplikacji mam na myśli Ustawienia -> Menedżer aplikacji -> Informacje o aplikacji, istnieje mała opcja "zaznacz" o nazwie "Pokaż powiadomienia" – goodm

2

Nie możesz uzyskać dostępu do tej właściwości, chyba że zadeklarujesz proces systemowy lub masz uprawnienia root'a, najpierw możesz zobaczyć uprawnienie do pliku: /data/system/notifycaiton_policy.xml: -wr ------.

W inny sposób zobacz kod źródłowy: /android/4.2/frameworks/base/services/java/com/android/server/NotificationManagerService.java. w API: public void setNotificationsEnabledForPackage(String pkg, boolean enabled) nie sprawdzi UID rozmówcy czy być Process.SYSTEM_UID:

void checkCallerIsSystem() { 
    int uid = Binder.getCallingUid(); 
    if (UserHandle.getAppId(uid) == Process.SYSTEM_UID || uid == 0) { 
     return; 
    } 
    throw new SecurityException("Disallowed call for uid " + uid); 
}