消息通知栏-禁止应用的消息通知

0. 消息通知栏-禁止应用的消息通知

《消息通知栏-禁止应用的消息通知》

1. 底层源码

frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java

package com.android.server.notification;

/** {@hide} */
public class NotificationManagerService extends SystemService {

        // 这里需要系统应用才有对应权限,即配置 android:sharedUserId="android.uid.system"
        @Override
        public void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {
            checkCallerIsSystem();

            setNotificationsEnabledForPackageImpl(pkg, uid, enabled);
            mRankingHelper.setEnabled(pkg, uid, enabled);
            savePolicyFile();
        }

        /**
         * Use this when you just want to know if notifications are OK for this package.
         */
        @Override
        public boolean areNotificationsEnabled(String pkg) {
            return areNotificationsEnabledForPackage(pkg, Binder.getCallingUid());
        }

2. 接口实现

2.1 工具类

import android.app.INotificationManager;
import android.app.Notification;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.util.Log;
import android.os.ServiceManager;

public class NotificationBackend {

    private static final int ERROR_UID = -1;
    private static final String TAG = "NotificationBackend";

    public static void setNotificationsBanned(Context mContext, String pkg, boolean enabled) {
        int uid = getUid(mContext, pkg);
        if (uid == ERROR_UID) {
            return ;
        }

        INotificationManager sINM = INotificationManager.Stub.asInterface(ServiceManager.getService(Context.NOTIFICATION_SERVICE));

        try {
            sINM.setNotificationsEnabledForPackage(pkg, uid, enabled);
            Log.d(TAG, "setNotificationsEnabledForPackage pkg = " + pkg + ", enabled = " + enabled);
        } catch (Exception e) {
            Log.w(TAG, "Error calling NoMan", e);
        }
    }

    public static boolean isNotificationsAllow(Context mContext, String pkg) {
        int uid = getUid(mContext, pkg);
        if (uid == ERROR_UID) {
            return false;
        }

        INotificationManager sINM = INotificationManager.Stub.asInterface(ServiceManager.getService(Context.NOTIFICATION_SERVICE));

        try {
            final boolean enabled = sINM.areNotificationsEnabledForPackage(pkg, getUid(mContext, pkg));
            Log.d(TAG, "isNotificationsBanned pkg = " + pkg + ", enabled = " + enabled);
            return enabled;
        } catch (Exception e) {
            Log.w(TAG, "Error calling NoMan", e);
            return false;
        }
    }

    public static int getUid(Context mContext, String pkg) {
        int uid = -1;
        try {
            PackageManager pm = mContext.getPackageManager();
            ApplicationInfo ai = pm.getApplicationInfo(pkg, PackageManager.GET_ACTIVITIES);
            uid = ai.uid;
            Log.d(TAG, "getUid = " + ai.uid);
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }

        return uid;
    }
}


2.2 AndroidManifest.xml 配置

android:sharedUserId="android.uid.system"
    原文作者:法迪
    原文地址: https://blog.csdn.net/su749520/article/details/82863720
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞