web-dev-qa-db-ja.com

Android-プッシュ通知はオンですか?

ユーザーがアプリ設定でプッシュ通知をオフにしたかどうかをプログラムで確認するにはどうすればよいですか?アプリから直接アプリ設定インテントを開いて、ユーザーにオンにするように促すことはできますか?

enter image description here

ありがとう

13
goodm

Googleクラウドメッセージングを参照していると仮定すると(Androidとプッシュ通知タグを使用しているため)、GCMサービスを有効/無効にするために使用される一般的な設定はありません(Appleとは異なります)。 _ iOSデバイス用のプッシュ通知サービス)。

アプリをインストールするときに、アプリがGoogleクラウドメッセージングを使用している場合、アプリが機能するために必要な権限のリストに表示されます。アプリのインストールを選択すると、プッシュ通知を送信できるようになります。

ただし、アプリが実際にGCMメッセージを受信するには、アプリをプログラムでGCMサービスに登録する必要があります。これは、アプリ内の任意の場所で行うことができ、ユーザーがGCMを有効/無効にできるapp settingsアクティビティ(またはフラグメントなど)を作成できます(これにより、GCMへの登録/登録解除がトリガーされます) )。アプリには、GCMへの登録時に受け取る登録IDを保持する永続ストアを含めることができ、そのストアを使用して、アプリがGCMに登録されているかどうかを判断できます。

アプリがすでに実行されている場合は、ユーザーにオンにするように依頼できます(それを実行するコードがある場合)。アプリが実行されておらず、アプリがそのデバイスのGCMに登録されていない場合、サーバーはGCMメッセージをアプリに送信できません。

その障害を克服したい場合は、GCMに自動的に登録できます(アプリが最初に起動されたとき)。その後、いつでもアプリにメッセージを送信できます。それでもユーザーにこれらの通知を表示するかどうかを決定させたい場合は、アプリ設定にフラグを設定して、着信GCMメッセージの結果として作成するUI通知を有効/無効にすることができます。 GCMサービスは常に有効になりますが、ユーザーが通知を表示することを選択しない限り、GCMメッセージが到着したときにアプリは何も表示しません。

8
Eran

システムプロセスを宣言するか、root権限がない限り、このプロパティにアクセスすることはできません。最初に、ファイルの権限を確認できます:/data/system/notifycaiton_policy.xml:-wr ------。

別の方法では、次のソースコードを参照してください:/Android/4.2/frameworks/base/services/Java/com/Android/server/NotificationManagerService.Java。 API:public void setNotificationsEnabledForPackage(String pkg, boolean enabled)では、呼び出し元のUIDが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);
}
3
user2719882