Android 6.0 permission

簡(jiǎn)介

Marshmallow (API 23) 引進(jìn)了Runtime Permissions 將權(quán)限大致劃分為敏感權(quán)限和普通權(quán)限: PHONE巡验,SMS 寨蹋,LOCATION 辩涝,CONTACTS 之類的隱私屬于敏感權(quán)限剂府,而NFC慷妙,INTERNET雏逾,BLUETOOTH 之類的屬于普通權(quán)限惕澎。如果app需要獲取敏感權(quán)限時(shí)需要在運(yùn)行時(shí)通過代碼請(qǐng)求權(quán)限杨幼,讓用戶手動(dòng)同意灯蝴。

  1. 只有設(shè)備 && TargetSdkVersion >= 23 才生效恢口,否則還是是采用安裝時(shí)獲取權(quán)限的方式。
  2. Manifest 中還是需要定義權(quán)限
屏幕快照

例子

 public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getPermissionToReadUserContacts();
    }

    private static final int READ_CONTACTS_PERMISSIONS_REQUEST = 1;

    private void getPermissionToReadUserContacts() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            if (PackageManager.PERMISSION_GRANTED !=
                    ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS)) {
                if (shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS)) {
                    Toast.makeText(this, "This permission is necessary", Toast.LENGTH_SHORT).show();
                }
                requestPermissions(new String[]{Manifest.permission.READ_CONTACTS}, READ_CONTACTS_PERMISSIONS_REQUEST);
            }
        }
    }

    @TargetApi(Build.VERSION_CODES.M)
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == READ_CONTACTS_PERMISSIONS_REQUEST) {
            if (grantResults.length == 1 &&
                    grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(this, "Read Contacts permission granted", Toast.LENGTH_SHORT).show();
            } else {
                // showRationale = false if user clicks Never Ask Again, otherwise true
                boolean showRationale = shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS);
                if (showRationale) {
                // do something here to handle degraded mode
                } else {
                    Toast.makeText(this, "permission denied", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
}

關(guān)鍵方法

ContextCompat.checkSelfPermission 檢查當(dāng)前是否已有權(quán)限
shouldShowRequestPermissionRationale 是否該提示用戶需求權(quán)限的原因
requestPermissions 請(qǐng)求權(quán)限
onRequestPermissionsResult 請(qǐng)求權(quán)限call back

shouldShowRequestPermissionRationale 是說用戶點(diǎn)了拒絕賦予權(quán)限绽乔,但也沒點(diǎn)‘不再提示’弧蝇,這時(shí)候如果實(shí)在需要權(quán)限就可以給予用戶適當(dāng)?shù)奶崾靖嬖V原因。

權(quán)限的分組

權(quán)限是分組的折砸,如果請(qǐng)求的是組內(nèi)的一個(gè)權(quán)限看疗,Android會(huì)自動(dòng)詢問用戶請(qǐng)求整個(gè)組的權(quán)限來避免大量請(qǐng)求權(quán)限。

可以通過以下命令查看所有敏感權(quán)限的分組情況:
$adb shell pm list permissions -d -g

比如:請(qǐng)求READ_CONTACTS 權(quán)限睦授,提示的給用戶的是要獲取CONTACTS組權(quán)限两芳,用戶同意后WRITE_CONTACTS 也被賦予了。


codepath
屏幕快照

第三方權(quán)限管理庫

PermissionsDispatcher

注解方式管理權(quán)限去枷,清晰方便

@RuntimePermissions
public class MainActivity extends AppCompatActivity {

    @NeedsPermission(Manifest.permission.CAMERA)
    void showCamera() {
        getSupportFragmentManager().beginTransaction()
                .replace(R.id.sample_content_fragment, CameraPreviewFragment.newInstance())
                .addToBackStack("camera")
                .commitAllowingStateLoss();
    }

    @OnShowRationale(Manifest.permission.CAMERA)
    void showRationaleForCamera(PermissionRequest request) {
        new AlertDialog.Builder(this)
            .setMessage(R.string.permission_camera_rationale)
            .setPositiveButton(R.string.button_allow, (dialog, button) -> request.proceed())
            .setNegativeButton(R.string.button_deny, (dialog, button) -> request.cancel())
            .show();
    }

    @OnPermissionDenied(Manifest.permission.CAMERA)
    void showDeniedForCamera() {
        Toast.makeText(this, R.string.permission_camera_denied, Toast.LENGTH_SHORT).show();
    }

    @OnNeverAskAgain(Manifest.permission.CAMERA)
    void showNeverAskForCamera() {
        Toast.makeText(this, R.string.permission_camera_neverask, Toast.LENGTH_SHORT).show();
    }
}

RxPermissions

rxjava 體系的權(quán)限管理怖辆,提供鏈?zhǔn)讲僮鳎畲蠛锰幉挥迷俜蛛x權(quán)限的請(qǐng)求與結(jié)果處理了删顶。

//RxPermission
       RxPermissions.getInstance(this)
                .request(Manifest.permission.READ_CONTACTS)
                .subscribe(new Action1<Boolean>() {
                    @Override
                    public void call(Boolean grant) {
                        if (grant) {
                            Toast.makeText(MainActivity.this, "this permission is necessary", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this, "Read Contacts permission granted", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竖螃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子逗余,更是在濱河造成了極大的恐慌特咆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件录粱,死亡現(xiàn)場(chǎng)離奇詭異腻格,居然都是意外死亡画拾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門菜职,熙熙樓的掌柜王于貴愁眉苦臉地迎上來青抛,“玉大人,你說我怎么就攤上這事酬核∶哿恚” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵愁茁,是天一觀的道長(zhǎng)蚕钦。 經(jīng)常有香客問我,道長(zhǎng)鹅很,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任罪帖,我火速辦了婚禮促煮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘整袁。我一直安慰自己菠齿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布坐昙。 她就那樣靜靜地躺著绳匀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪炸客。 梳的紋絲不亂的頭發(fā)上疾棵,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音痹仙,去河邊找鬼是尔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛开仰,可吹牛的內(nèi)容都是我干的拟枚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼众弓,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼恩溅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谓娃,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤脚乡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后傻粘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體每窖,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡帮掉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窒典。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蟆炊。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瀑志,靈堂內(nèi)的尸體忽然破棺而出涩搓,到底是詐尸還是另有隱情,我是刑警寧澤劈猪,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布昧甘,位于F島的核電站,受9級(jí)特大地震影響战得,放射性物質(zhì)發(fā)生泄漏充边。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一常侦、第九天 我趴在偏房一處隱蔽的房頂上張望浇冰。 院中可真熱鬧,春花似錦聋亡、人聲如沸肘习。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漂佩。三九已至,卻和暖如春罪塔,著一層夾襖步出監(jiān)牢的瞬間投蝉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工垢袱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墓拜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓请契,卻偏偏與公主長(zhǎng)得像咳榜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子爽锥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • Android_Permition 最新版本權(quán)限問題 android 6.0 權(quán)限限制問題涌韩,部分權(quán)限必須現(xiàn)請(qǐng)求一下...
    zcwfeng閱讀 505評(píng)論 0 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,077評(píng)論 25 707
  • 一、引言 隨著Android6.0發(fā)布氯夷,系統(tǒng)增加了一些新的特性和功能臣樱。這次的發(fā)布介紹了一種新的權(quán)限機(jī)制。用戶可以在...
    宇是我閱讀 7,422評(píng)論 7 41
  • 蘇曉薈正在辦公室里核對(duì)員工的考勤表時(shí),座機(jī)響了起來雇毫,她放下筆側(cè)頭去看玄捕,是前臺(tái)的號(hào)碼,“喂棚放∶墩常” “蘇姐,樓下有你的快...
    邵悅婷閱讀 421評(píng)論 0 5