一笼呆、前言:
最近項(xiàng)目中在完善推送功能,需要進(jìn)入APP時(shí)檢測一下是否開啟了推送權(quán)限昧碉,如果沒有開啟彈窗提醒英染,當(dāng)用戶點(diǎn)擊彈窗時(shí)直接跳轉(zhuǎn)到APP的通知設(shè)置界面揽惹,就像下面這種:
二、需求實(shí)現(xiàn)
1四康、檢測是否開啟通知權(quán)限
接到需求時(shí)一臉懵搪搏,不知道咋實(shí)現(xiàn),先是一番搜索闪金,搜索后得知可以通過NotificationManagerCompat 中的 areNotificationsEnabled()來判斷是否開啟通知權(quán)限疯溺。
查閱官方文檔可知 NotificationManagerCompat 在 android.support.v4.app包中,是API 22.1.0 中加入的哎垦。而 areNotificationsEnabled()則是在 API 24.1.0之后加入的喝检。
areNotificationsEnabled 只對 API 19 及以上版本有效,低于API 19 會(huì)一直返回true
2撼泛、跳轉(zhuǎn)到通知設(shè)置界面
假設(shè)沒有開啟通知權(quán)限,點(diǎn)擊之后就需要跳轉(zhuǎn)到 APP的通知設(shè)置界面澡谭,對應(yīng)的Action是:Settings.ACTION_APP_NOTIFICATION_SETTINGS, 這個(gè)Action是 API 26 后增加的愿题。APP的通知設(shè)置界面如下圖:
如果在部分手機(jī)中無法精確的跳轉(zhuǎn)到 APP對應(yīng)的通知設(shè)置界面,那么我們就考慮直接跳轉(zhuǎn)到 APP信息界面蛙奖,對應(yīng)的Action是:Settings.ACTION_APPLICATION_DETAILS_SETTINGS潘酗。APP信息界面如下圖:
3、代碼實(shí)現(xiàn):
/**
* 通知工具
*/
public class NotificationsUtils {
/**
* 是否打開通知按鈕
* @param context
* @return
*/
public static boolean isNotificationEnabled(Context context) {
return NotificationManagerCompat.from(context.getApplicationContext()).areNotificationsEnabled();
}
public static void openPush(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//這種方案適用于 API 26, 即8.0(含8.0)以上可以用
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
intent.putExtra(Settings.EXTRA_APP_PACKAGE, activity.getPackageName());
intent.putExtra(Settings.EXTRA_CHANNEL_ID, activity.getApplicationInfo().uid);
activity.startActivity(intent);
} else {
toPermissionSetting(activity);
}
}
/**
* 跳轉(zhuǎn)到權(quán)限設(shè)置
*
* @param activity
*/
public static void toPermissionSetting(Activity activity) {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.LOLLIPOP_MR1) {
toSystemConfig(activity);
} else {
try {
toApplicationInfo(activity);
} catch (Exception e) {
e.printStackTrace();
toSystemConfig(activity);
}
}
}
/**
* 應(yīng)用信息界面
*
* @param activity
*/
public static void toApplicationInfo(Activity activity) {
Intent localIntent = new Intent();
localIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
localIntent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
localIntent.setData(Uri.fromParts("package", activity.getPackageName(), null));
activity.startActivity(localIntent);
}
/**
* 系統(tǒng)設(shè)置界面
*
* @param activity
*/
public static void toSystemConfig(Activity activity) {
try {
Intent intent = new Intent(Settings.ACTION_SETTINGS);
activity.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
4雁仲、踩坑記錄
A: com.android.support包的版本
因?yàn)?NotificationManagerCompat 是 22.1.0才有的仔夺,其中的 areNotificaitonEnabled() 是 24.1.0 才有的,Settings.ACTION_APP_NOTIFICATION_SETTINGS 是 26 才有的攒砖,所以缸兔,為了保證這些內(nèi)容在不同版本中生效,最好在 gradle文件中 support 的版本升級到最新吹艇。如:
implementation 'com.android.support:appcompat-v7:27.1.1'
B: 部分國產(chǎn)手機(jī)中沒有APP通知設(shè)置頁面
在部分國產(chǎn)手機(jī)系統(tǒng)中惰蜜,Settings.ACTION_APPLICATION_DETAILS_SETTINGS對應(yīng)的Activity是不存在的,比如:錘子堅(jiān)果3——OC105 API25受神。
所以抛猖,在堅(jiān)果3手機(jī)上,最終會(huì)走我們代碼中的 catch 節(jié)點(diǎn)鼻听,然后進(jìn)入到 應(yīng)用信息界面财著。
下面兩張圖分別是 錘子堅(jiān)果3 手機(jī)的截圖。第一張是 設(shè)置--通知中心的界面撑碴,點(diǎn)擊之后只是一個(gè)開關(guān)的開啟和關(guān)閉撑教,并沒有再進(jìn)入詳細(xì)的通知設(shè)置界面。第二張是 應(yīng)用管理--應(yīng)用程序管理--應(yīng)用信息界面醉拓, 點(diǎn)擊其中的 允許推送通知時(shí)也只是開關(guān)的開啟和關(guān)閉驮履。
C: 部分國產(chǎn)手機(jī) APP通知設(shè)置界面中沒有開啟和關(guān)閉的操作
部分國產(chǎn)手機(jī)中 Settings.ACTION_APPLICATION_DETAILS_SETTINGS對應(yīng)的Activity并不是我們期望的通知設(shè)置界面鱼辙。比如,小米6玫镐。小米6中 Settings.ACTION_APPLICATION_DETAILS_SETTINGS對應(yīng)的通知設(shè)置界面如下:
這完全不是我們需要的界面啊倒戏。。恐似。里面并沒有我們想要的開關(guān)啊杜跷。而且,在小米6中 Settings.ACTION_APPLICATION_DETAILS_SETTINGS 對應(yīng)的應(yīng)用信息界面中矫夷,點(diǎn)擊其中的 通知管理 之后跳轉(zhuǎn)的也是上面圖中的樣子葛闷。
但是,如果我們手動(dòng)的從 設(shè)置--通知和狀態(tài)欄--通知管理 進(jìn)入我們應(yīng)用的通知設(shè)置界面時(shí)双藕,就可以正常的看到 允許通知的開關(guān)淑趾,如下圖:
對于小米6手機(jī)的這個(gè)情況,分析了一陣子之后還是沒找到解決辦法忧陪。本來想著通過log確認(rèn)一下上圖中的界面到底是哪個(gè)Activity扣泊,但非常郁悶的是Log中只得到了
com.android.settings/.SubSettings
這么一個(gè)地址,之前沒見過這個(gè)地址嘶摊,然后繼續(xù)搜索延蟹。在看完 https://www.cnblogs.com/Lefter/archive/2013/04/27/3048010.html 和 https://blog.csdn.net/hfreeman2008/article/details/52778992 之后,明白了 .SubSettings 是干啥的了叶堆。也大致推斷出為啥在小米6上得不到我們想要的界面了——他們在定制系統(tǒng)時(shí)更改了通知設(shè)置界面對應(yīng)的FragmentZ迤!J拧沥匈!
5、參考鏈接
(1)通知設(shè)置的參考鏈接
- https://stackoverflow.com/questions/32366649/any-way-to-link-to-the-android-notification-settings-for-my-app
- https://blog.csdn.net/ysy950803/article/details/71910806
- https://juejin.im/post/5a2508656fb9a0450407b638
(2)SubSettings 和 Settings 的參考鏈接
- https://www.cnblogs.com/Lefter/archive/2013/04/27/3048010.html
- https://blog.csdn.net/hfreeman2008/article/details/52778992
6忘渔、文中代碼的GitHub地址
文中代碼分別對應(yīng)下列倉庫中的:b_34_checkNotify咐熙、b_34_pushcheck
Java版:https://github.com/CnPeng/CnPengAndroid.git
Kotlin版:https://github.com/CnPeng/CnPengKotlin.git
作者:CnPeng
轉(zhuǎn)載鏈接:http://www.reibang.com/p/1e27efb1dcac