輕松搞定 Android 6.0 新特征 [權(quán)限-Permission]

在早期版本的Android中适肠,權(quán)限的申請十分簡單,在AndroidManifest.xml中請求對應(yīng)的權(quán)限就可以了制圈。

Google發(fā)現(xiàn)们童,這樣子的權(quán)限申請方式,問題好大>小慧库!因?yàn)橛脩粼诎惭b的時候,只需要同意一次即會同意所有權(quán)限馋嗜,沒辦法單個拒絕權(quán)限完沪,造成用戶信息的泄露。(直接安裝apk嵌戈,同意一次即可覆积;如果在GooglePlay安裝,也是同意權(quán)限就直接下載了)一個相對合理的權(quán)限方案熟呛,千呼萬喚終于來了宽档。為了不對早期版本的App造成傷害,在早期的Build版本的Apk庵朝,直接在Manifest里申請權(quán)限吗冤,是沒有問題了,不過發(fā)布Google Play的時候九府,會提示你要用最新的BuildTool(國內(nèi)環(huán)境跟不上沒辦法)早期的方案就不記錄了椎瘟,這里看看最新的方案要怎么弄!(其實(shí)官方教程和網(wǎng)上資料都很多侄旬,官方教程很詳細(xì)肺蔚,網(wǎng)上的資料就比較亂,甚至有些把簡單的權(quán)限方式弄的太復(fù)雜了儡羔,或者說對應(yīng)一般的情況宣羊,可以有更簡單的解決方法)

這里先大致貼一下思路(假設(shè)獲取位置的FINE_LOCATION權(quán)限):

1.檢查是否已經(jīng)有這個權(quán)限(有權(quán)限,直接就去執(zhí)行定位吧)
2.如果沒有這個權(quán)限汰蜘,就向用戶申請這個權(quán)限
3.用戶如果允許仇冯,執(zhí)行定位,用戶如果拒絕族操,執(zhí)行其他操作(千萬別像某信苛坚,某寶,某度那樣,不給權(quán)限不運(yùn)行App哦F貌铡=闵摹!)

那么對應(yīng)的代碼就是這樣:
// RequestCode是獲取返回用的柠掂!
private final int PERMISSION_REQUEST_CODE = 1;
// 方法项滑,獲取位置權(quán)限
protected void requestFineLocationPermission() {
  String permission = Manifest.permission.ACCESS_FINE_LOCATION;
  if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
    // 此時還沒有權(quán)限!
    ActivityCompat.requestPermissions(this, new String[]{permission}, PERMISSION_REQUEST_CODE);
  }
  else {
    // 有權(quán)限了涯贞,去做該做的事情吧枪狂!
  }
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  if(requestCode == PERMISSION_REQUEST_CODE) {
    if(grantResults[0] == PackageManager.PERMISSION_GRANTED) {
      //權(quán)限通過
    }
    }else{
      //權(quán)限拒絕
    }
    return;
  }
  super.onRequestPermissionsResult(requestCode,permissions,grantResults);
}
是的,就是這么簡單宋渔。不過州疾,如果你就這樣子用在了你的項(xiàng)目里,會有坑;始稹Q媳汀!
如果你本身就是Android用戶氧急,細(xì)心的你一定會發(fā)現(xiàn)颗胡,App在向你申請權(quán)限的時候,你會有幾個選項(xiàng):

1.允許
2.禁止
3.還可以禁止后不再詢問7园印(坑就出現(xiàn)在這里了)

image.png

如果按上面的代碼毒姨,你會永遠(yuǎn)得到一個結(jié)果:用戶拒絕!6で蕖(如果用戶是不小心點(diǎn)錯弧呐,或者出于好奇心嘗試,那很容易就懵逼了)而且你的requestPermissions方法嵌纲,在用戶面前完全不會顯示權(quán)限對話框俘枫!

所以我們要修改一下第二段:
// 方法,獲取位置權(quán)限
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 權(quán)限通過
        } else {
            // 權(quán)限拒絕
            if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
                // 禁止后不再詢問了逮走!
            } else {
                // 用戶此次選擇了禁止權(quán)限
            }
        }
        return;
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

這個方法鸠蚪,shouldShowRequestPermissionRationale,翻譯過來就是:是否應(yīng)該顯示請求權(quán)限的說明言沐。我們就可以用來檢查用戶是否選擇了“禁止后不再詢問”邓嘹。
這里就簡單說一下返回值Boolean的意思,True表示此時應(yīng)該顯示說明险胰,F(xiàn)alse表示用戶選擇了不要再提示了,證明用戶不想將該權(quán)限賦予你的App矿筝,不用解釋了……

至此起便,這個功能算是可用了!!榆综!但是妙痹,還不完美!1谴怯伊!必須稍微封裝一下讓自己用起來更方便嘛!思路如下:

1.一個Class MyBaseActivity判沟,這個相信你會有
2.一個Interface PermissionListener(可選耿芹,不然就在MyBaseActivity里添加可復(fù)寫方法)

這里用Interface的方法貼一下代碼:(其實(shí)在MyBaseActivity里會更簡單哈)

private final int PERMISSION_REQUEST_CODE = 1;
private int mPermissionRequestId;
private PermissionListener mPermissionListener;

protected void permissionRequest(int requestId, String permission, PermissionListener listener) {
        mPermissionListener = listener;
        mPermissionRequestId = requestId;
        if (ContextCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED) {
            mPermissionListener.onPermissionConfirmed(mPermissionRequestId);
        } else {
            // 嘗試請求權(quán)限
            ActivityCompat.requestPermissions(this, new String[]{permission}, PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                //權(quán)限通過
                mPermissionListener.onPermissionConfirmed(mPermissionRequestId);
            } else {
                //權(quán)限拒絕
                if (!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
                    // 用戶直接拒絕了(不再顯示)
                    mPermissionListener.onPermissionDeniedForever(mPermissionRequestId);
                } else {
                    // 用戶此次選擇了禁止權(quán)限
                    mPermissionListener.onPermissionDenied(mPermissionRequestId);
                }
            }
            return;
        }
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    public interface PermissionListener {
        void onPermissionConfirmed(int requestId);

        void onPermissionDenied(int requestId);

        void onPermissionDeniedForever(int requestId);
    }
然后,在你的Activity里挪哄,extend你的MyBaseActivity吧秕,implements剛才那個Interface,然后通過剛才寫的這個方法:permissionRequest(YOUR_REQUEST_ID, Manifest.permission.PERMISSION_YOU_WANT, YourActivity.this);就可以在接口回調(diào)里知道權(quán)限的情況咯迹炼!

(個人覺得在MyBaseActivity里加模板方法的方案會更優(yōu)砸彬,這里就不貼出來了,自己嘗試吧K谷搿)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末砂碉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刻两,更是在濱河造成了極大的恐慌绽淘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闹伪,死亡現(xiàn)場離奇詭異沪铭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)偏瓤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門杀怠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厅克,你說我怎么就攤上這事赔退。” “怎么了证舟?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵硕旗,是天一觀的道長。 經(jīng)常有香客問我女责,道長漆枚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任抵知,我火速辦了婚禮墙基,結(jié)果婚禮上软族,老公的妹妹穿的比我還像新娘。我一直安慰自己残制,他們只是感情好立砸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著初茶,像睡著了一般颗祝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恼布,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天螺戳,我揣著相機(jī)與錄音,去河邊找鬼桥氏。 笑死温峭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的字支。 我是一名探鬼主播凤藏,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼堕伪!你這毒婦竟也來了揖庄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤欠雌,失蹤者是張志新(化名)和其女友劉穎蹄梢,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體富俄,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡禁炒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霍比。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幕袱。...
    茶點(diǎn)故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖悠瞬,靈堂內(nèi)的尸體忽然破棺而出们豌,到底是詐尸還是另有隱情,我是刑警寧澤浅妆,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布望迎,位于F島的核電站,受9級特大地震影響凌外,放射性物質(zhì)發(fā)生泄漏辩尊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一趴乡、第九天 我趴在偏房一處隱蔽的房頂上張望对省。 院中可真熱鬧蝗拿,春花似錦晾捏、人聲如沸蒿涎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劳秋。三九已至,卻和暖如春胖齐,著一層夾襖步出監(jiān)牢的瞬間玻淑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工呀伙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留补履,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓剿另,卻偏偏與公主長得像箫锤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子雨女,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評論 2 345

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