深井菜鸟
深井菜鸟
  • 发布:2022-12-09 15:52
  • 更新:2022-12-09 15:52
  • 阅读:506

关于Android 部分手机NotificationManagerCompat.from 返回null 解决办法

分类:Native.js
NJS

在做一个检查应用是否拥有通知权限功能的时候发现部分手机(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())
2 关注 分享
p***@vip.qq.com 诚实小郎君

要回复文章请先登录注册