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

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"
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值