通常狀況下,Api 19 之前是沒有通知管理的,默認都是開啓,不用管。 Api 19 -- 24 雖加入了通知管理功能,但沒有開放檢測是否開啓了通知的接口,開發者只能用反射來獲取權限值。 Api 24 以上,NotificationManager 提供了 areNotificationsEnabled()方法檢測通知權限。 support 包已經考慮了以上場景,在 24.1.0 開放了areNotificationsEnabled(),在19如下默認返回true,19-24返回對應反射值,24以上用原生NotificationManager 檢測。html
特殊狀況是部分國產機,加入了通知相關定製功能,開發者是無從控制的或檢測的,徹底瞎子。好比下面這種通知是否顯示在 status bar 的管理。 java
也就是說,大部分狀況,咱們用:NotificationManagerCompat.from(context).areNotificationsEnabled()
複製代碼
可適配除部分國產機之外的大部分機型。特殊機型暫時沒辦法,有小夥伴知道怎麼搞的話求告知。android
一樣與 api 版本和機型有關。git
>=21:github
//21 以上,直接跳通知欄權限設置頁
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
intent.putExtra("app_package", context.getPackageName());
intent.putExtra("app_uid", context.getApplicationInfo().uid);
}
複製代碼
9<=,<21:api
//9 - 21,只能跳到 app 詳情頁
else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD){
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
}
複製代碼
<9:app
//9如下的 app 詳情頁
else if(Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD){
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Intent.ACTION_VIEW);
intent.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");
intent.putExtra("com.android.settings.ApplicationPkgName", context.getPackageName());
}
複製代碼
有些國產機是提供本身的權限管家軟件管理通知權限的,對於這些機子,儘可能跳轉到權限對應的管家頁面。 部分 vivo:工具
// 點擊設置圖標>加速白名單>個人app
// 點擊軟件管理>軟件管理權限>軟件>個人app>信任該軟件
Intent appIntent = context.getPackageManager().getLaunchIntentForPackage("com.iqoo.secure");
if(appIntent != null){
Log.i("isPushEnable","start1");
context.startActivity(appIntent);
return;
}
複製代碼
部分 oppo:測試
// oppo 點擊設置圖標>應用權限管理>按應用程序管理>個人app>我信任該應用
// 點擊權限隱私>自啓動管理>個人app
appIntent = context.getPackageManager().getLaunchIntentForPackage("com.oppo.safe");
if(appIntent != null){
Log.i("isPushEnable","start2");
context.startActivity(appIntent);
return;
}
複製代碼
其餘機型待測試補充... 以上跳轉業務我集合成了一個小工具 NotificationPageHelper,安裝後 NotificationPageHelper.open(Context context) 便可。ui
參考: