在做一个检查应用是否拥有通知权限功能的时候发现部分手机(Redmi Note 5A 【Android 7.1.2】)调用NotificationManagerCompat.from(context) 会返回null
查阅了Android Dev 文档,官方描述NotificationManagerCompat.from 的返回值是 NonNull的 理应不会返回null
尝试修复方式如下,我自己去看了NotificationManagerCompat.from + NotificationManagerCompat.areNotificationsEnabled源代码手撸的;
相当于给NotificationManagerCompat.from 添加了个Polyfill;
const activity = plus.android.runtimeMainActivity();
const NotificationManagerCompat = plus.android.importClass('androidx.core.app.NotificationManagerCompat');
const manager = NotificationManagerCompat.from(activity) || {
/** 手动实现 NotificationManagerCompat,因为部分手机NotificationManagerCompat.from会返回null */
areNotificationsEnabled() {
const Build = plus.android.importClass('android.os.Build');
if (Build.VERSION.SDK_INT >= 24) {
plus.android.importClass('android.app.NotificationManager');
const notificationManager = activity.getSystemService(activity.NOTIFICATION_SERVICE);
const areNotificationsEnabled = notificationManager.areNotificationsEnabled();
plus.android.autoCollection(notificationManager);
return areNotificationsEnabled;
} else if (Build.VERSION.SDK_INT >= 19) {
const AppOpsManager = plus.android.importClass('android.app.AppOpsManager');
const ApplicationInfo = plus.android.importClass('android.content.pm.ApplicationInfo');
const appOps = activity.getSystemService(activity.APP_OPS_SERVICE);
const appInfo = activity.getApplicationInfo();
try {
const isEnabled = appOps.checkOpNoThrow(
AppOpsManager.OP_POST_NOTIFICATION,
plus.android.getAttribute(appInfo, 'uid'), //直接appInfo.uid 返回的是undefined
activity.getApplicationContext().getPackageName()
) === AppOpsManager.MODE_ALLOWED;
plus.android.autoCollection(appOps);
plus.android.autoCollection(appInfo);
return isEnabled;
} catch (e) {
return true;
}
}
return true;
}
};
console.log(manager.areNotificationsEnabled())