Android:檢查通知權(quán)限并跳轉(zhuǎn)到通知設(shè)置界面

一笼呆、前言:

最近項(xiàng)目中在完善推送功能,需要進(jìn)入APP時(shí)檢測一下是否開啟了推送權(quán)限昧碉,如果沒有開啟彈窗提醒英染,當(dāng)用戶點(diǎn)擊彈窗時(shí)直接跳轉(zhuǎn)到APP的通知設(shè)置界面揽惹,就像下面這種:

圖片.png

二、需求實(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è)置界面如下圖:

圖片.png

如果在部分手機(jī)中無法精確的跳轉(zhuǎn)到 APP對應(yīng)的通知設(shè)置界面,那么我們就考慮直接跳轉(zhuǎn)到 APP信息界面蛙奖,對應(yīng)的Action是:Settings.ACTION_APPLICATION_DETAILS_SETTINGS潘酗。APP信息界面如下圖:

圖片.png

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)閉驮履。

image
image
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è)置界面如下:

image

這完全不是我們需要的界面啊倒戏。。恐似。里面并沒有我們想要的開關(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)淑趾,如下圖:

image

對于小米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.htmlhttps://blog.csdn.net/hfreeman2008/article/details/52778992 之后,明白了 .SubSettings 是干啥的了叶堆。也大致推斷出為啥在小米6上得不到我們想要的界面了——他們在定制系統(tǒng)時(shí)更改了通知設(shè)置界面對應(yīng)的FragmentZ迤!J拧沥匈!

5、參考鏈接

(1)通知設(shè)置的參考鏈接

(2)SubSettings 和 Settings 的參考鏈接

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辨萍,隨后出現(xiàn)的幾起案子棋恼,更是在濱河造成了極大的恐慌,老刑警劉巖锈玉,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件爪飘,死亡現(xiàn)場離奇詭異,居然都是意外死亡拉背,警方通過查閱死者的電腦和手機(jī)师崎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來椅棺,“玉大人犁罩,你說我怎么就攤上這事齐蔽。” “怎么了床估?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵含滴,是天一觀的道長。 經(jīng)常有香客問我丐巫,道長谈况,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任递胧,我火速辦了婚禮碑韵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缎脾。我一直安慰自己祝闻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布遗菠。 她就那樣靜靜地躺著联喘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舷蒲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天友多,我揣著相機(jī)與錄音牲平,去河邊找鬼。 笑死域滥,一個(gè)胖子當(dāng)著我的面吹牛纵柿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播启绰,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼昂儒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了委可?” 一聲冷哼從身側(cè)響起渊跋,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎着倾,沒想到半個(gè)月后拾酝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卡者,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年蒿囤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崇决。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡材诽,死狀恐怖底挫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脸侥,我是刑警寧澤建邓,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站湿痢,受9級特大地震影響涝缝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜譬重,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一拒逮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧臀规,春花似錦滩援、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谨究,卻和暖如春恩袱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胶哲。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工畔塔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸯屿。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓澈吨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親寄摆。 傳聞我的和親對象是個(gè)殘疾皇子谅辣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容