系统环境:安卓5.1
--- a/frameworks/base/services/core/java/com/android/server/AppOpsService.java
+++ b/frameworks/base/services/core/java/com/android/server/AppOpsService.java
@@ -598,6 +598,16 @@ public class AppOpsService extends IAppOpsService.Stub {
verifyIncomingUid(uid);
verifyIncomingOp(code);
synchronized (this) {
+ //zk add for block some app notifications
+ if(code == AppOpsManager.OP_POST_NOTIFICATION){
+ if (packageName.equals("com.android.dialer") || packageName.equals("com.nbpt.gateway.lancher")) {
+ return AppOpsManager.MODE_ALLOWED;
+ }else {
+ return AppOpsManager.MODE_IGNORED;
+ }
+ }
+ // add by zk end
只保留了两个应用通知,包名:1.com.android.dialer 2.com.nbpt.gateway.lancher
--- a/frameworks/base/core/java/android/app/AppOpsManager.java
+++ b/frameworks/base/core/java/android/app/AppOpsManager.java
@@ -863,7 +863,7 @@ public class AppOpsManager {
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
- AppOpsManager.MODE_ALLOWED,
+ AppOpsManager.MODE_IGNORED,
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
AppOpsManager.MODE_ALLOWED,
默认关闭所有的应用通知,对应OP_POST_NOTIFICATION。后来发现一个问题,就是当默认关闭了所有应用通知之后,Toast无法弹出,虽然在设置里显示没有屏蔽应用通知,但是的进行开关操作才能弹出,要想解决关闭应用通知无法弹出Toast问题,进行如下修改:
--- a/frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1067,12 +1067,12 @@ public class NotificationManagerService extends SystemService {
final boolean isSystemToast = isCallerSystem() || ("android".equals(pkg));
- if (ENABLE_BLOCKED_TOASTS && !noteNotificationOp(pkg, Binder.getCallingUid())) {
+ /*if (ENABLE_BLOCKED_TOASTS && !noteNotificationOp(pkg, Binder.getCallingUid())) {
if (!isSystemToast) {
Slog.e(TAG, "Suppressing toast from package " + pkg + " by user request.");
return;
}
- }
+ }*/
到这里修改就可以了,我们来看看noteNotificationOp()函数
private boolean noteNotificationOp(String pkg, int uid) {
if (mAppOps.noteOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
!= AppOpsManager.MODE_ALLOWED) {
Slog.v(TAG, "notifications are disabled by AppOps for " + pkg);
return false;
}
return true;
}
在里面进行了
if(mAppOps.noteOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg) !=AppOpsManager.MODE_ALLOWED)的判断
目的是在弹Toast时候不去进行AppOpsManager.OP_POST_NOTIFICATION的判断。就OK了!