麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Android > 正文

Android 6.0+ 權限申請

2019-11-08 00:22:09
字體:
來源:轉載
供稿:網友

Android 6.0+ 權限申請

前言

安卓系統權限(Runtime Permissions)分為兩種:普通權限高危權限。對于普通權限的申請,只在APP安裝的時候詢問一次,而對于高危權限,從Android M(API.23)開始,將會在APP運行時動態申請,這樣就可以使用戶選擇是否授予APP該權限,從而保護用戶安全。

運行時權限官方文檔解釋:https://developer.android.com/training/permissions/requesting.html

注: - 如果設備系統低于6.0,權限只會在APP安裝時詢問 - 如果targetSdkVersion小于23,權限只會在APP安裝時詢問


需要動態申請的權限包括以下幾種。

注意:同一個組內一個權限被授權了,同組內其他權限也自動被授權

Permission Group Permissions
CALENDAR READ_CALENDAR,WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS,WRITE_CONTACTS , GET_ACCOUNTS
LOCATION access_FINE_LOCATION,ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE,CALL_PHONE,READ_CALL_LOG,WRITE_CALL_LOG,ADD_VOICEMAIL,USE_Sip,PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS,RECEIVE_SMS,READ_SMS,RECEIVE_WAP_PUSH,RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE

有圖有真相

權限申請

運行時的權限申請

首先判斷權限是否已經被申請如果沒有申請該權限,則申請權限第一次申請被拒絕(用戶也未點擊不再詢問),如果再次申請權限,需要給用戶提示,為什么需要申請該權限,并在用戶點擊允許后,申請該權限

1.權限判斷

int checkSelfPermission = ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA); if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) { // 沒有權限,需要申請 } else { // 有權限了 }

2.權限申請

ActivityCompat.requestPermissions(MainActivity.this,new String[] { Manifest.permission.CAMERA }, REQUEST_STORAGE_PERMISSION);

申請權限的時候,第二個參數為數組格式,也就是說,可以同時申請多個權限,但不建議這么做。REQUEST_STORAGE_PERMISSION為自定義的請求碼。

如果在Fragment中申請權限的話,需要調用Fragment的requestPermissions(...)方法,把ActivityCompat.requestPermissions改為requestPermissions。否則會回調到Activity的 onRequestPermissionsResult方法。

3.處理權限申請回調-onRequestPermissionsResult

權限申請的成功或失敗之后的操作需要在此回調方法中實現。

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { switch (requestCode) { case REQUEST_STORAGE_PERMISSION: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 權限獲得成功 } else { // 權限沒有獲得 } break; } super.onRequestPermissionsResult(requestCode, permissions, grantResults); }因為權限可以同時申請多個,所以回調結果也是以數組的方式返回。此處我們以只請求一個權限為例,如果用戶授予權限,則 grantResults[0] = PackageManager.PERMISSION_GRANTED;

4.shouldShowRequestPermissionRationale(…)

1.第一次申請權限的時候,該方法返回false 2.第一次申請權限失敗,用戶點擊拒絕授權后,如果再次申請權限,則該方法返回true 3.如果用戶拒絕授權并選擇[不再提醒]之后,該方法返回false 4.設備系統禁止APP使用該權限后,返回false

用戶拒絕授權權限的時候,系統會提供一個方法讓我們解釋為什么要申請該權限。因此,我們可以顯示一個Dialog向用戶再次申請權限。

if (checkSelfPermission != PackageManager.PERMISSION_GRANTED) { if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { //向用戶解釋權限申請原因 AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("二維碼掃描需要使用相機權限"); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { // 權限申請 } }); builder.setNegativeButton("Cancle", null); builder.show(); } else { // 權限申請 } } else { // 有權限了 }

第三方庫 EasyPermissions

EasyPermissions簡化了Android運行時權限申請、判斷、處理的操作步驟 官方文檔 https://github.com/googlesamples/easypermissions

1.build.gradle添加依賴

dependencies { compile 'pub.devrel:easypermissions:0.3.0'

注:如果提示Error:Failed to resolve: com.android.support:appcompat-v7:25.1.0,就是需要你升級你的SDK了。

2.檢查權限

String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (!EasyPermissions.haspermissions(this, perms)) { // 沒有權限 }

3.申請權限

@AfterPermissionGranted(REQUEST_CODE_QRCODE_PERMISSIONS) private void requestCodeQRCodePermissions() { String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (!EasyPermissions.hasPermissions(this, perms)) { EasyPermissions.requestPermissions(this, "掃描二維碼需要打開相機和散光燈的權限", REQUEST_CODE_QRCODE_PERMISSIONS, perms); }else { // 權限已經有了,可以進行其他操作 } }

在第一次申請失敗后,如果需要再次申請,會自動彈出Dialog對話框,第二個參數即為對話框的Message,向用戶解釋為什么申請該權限,提高用戶授權的可能性。

AfterPermissionGranted是一個可選的注解,如果有此標簽,那么當request值對應的權限申請通過的話會自動調用該方法。

4.實現EasyPermissions.PermissionCallbacks接口,直接處理權限申請的成功或失敗

@Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // Forward results to EasyPermissions EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); } @Override public void onPermissionsGranted(int requestCode, List<String> perms) { // 權限申請成功 } @Override public void onPermissionsDenied(int requestCode, List<String> perms) { // 權限申請失敗 }

5.用戶點擊“不在詢問”

如果用戶點擊了”不在詢問“,就無法在通過APP獲取權限了,權限只能在設置界面重新授予。這種情況下,你可以使用EasyPermissions.somePermissionPermanentlyDenied(...)方法來顯示一個系統對話框,用以打開系統設置界面。

@Override public void onPermissionsDenied(int requestCode, List<String> perms) { // 權限申請失敗 if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { new AppSettingsDialog.Builder(this).build().show(); } }

當用戶從設置界面返回到APP界面的時候,在onActivityResult(...)方法中就可以再次判斷權限的授權情況了。

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == AppSettingsDialog.DEFAULT_SETTINGS_REQ_CODE){ String[] perms = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (EasyPermissions.hasPermissions(this, perms)) { Toast.makeText(MainActivity.this,"權限被用戶通過設置界面重新授予了",Toast.LENGTH_SHORT).show(); } } }

這里寫圖片描述

最后

附上demo地址: http://download.csdn.net/download/u014527323/9762717


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲卡通动漫在线观看 | 久久草在线视频国产 | 久草在线高清 | 高清中文字幕在线 | 最新亚洲国产 | 午夜精品小视频 | 免费视频一区 | 成码无人av片在线观看网站 | 911色_911色sss主站色播 | av电影免费播放 | 久久精品亚洲精品国产欧美kt∨ | 在线看小早川怜子av | 毛片免费观看完整版 | 亚洲日本韩国精品 | 日日做夜夜操 | 亚洲午夜精品视频 | 国产精品麻豆一区二区三区 | 天天看成人免费毛片视频 | 黑色丝袜美美女被躁视频 | 麻豆视频在线观看 | 中文字幕在线观看视频一区 | 亚洲天堂成人在线观看 | 国产免费久久久久 | 自拍偷拍999 | 一级性生活免费视频 | 国产精品探花在线观看 | 日本看片一区二区三区高清 | 亚洲第一页综合 | 久久亚洲成人 | 美女黄影院 | 视频国产一区二区 | 护士xxxx | 欧美日韩免费在线观看视频 | 久久精品久久精品国产大片 | 久久久久久久久久久综合 | 成人一级片毛片 | 男人的天堂色偷偷 | 久章草影院| 国产一区二区成人在线 | 国产二区三区在线播放 | 看毛片电影 |