消息通知栏-禁止应用的消息通知
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"