国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android 6.0+ 權限申請

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

Android 6.0+ 權限申請

前言

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

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

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


需要動態(tài)申請的權限包括以下幾種。

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

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);

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

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

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

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

@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); }因為權限可以同時申請多個,所以回調結果也是以數(shù)組的方式返回。此處我們以只請求一個權限為例,如果用戶授予權限,則 grantResults[0] = PackageManager.PERMISSION_GRANTED;

4.shouldShowRequestPermissionRationale(…)

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

用戶拒絕授權權限的時候,系統(tǒng)會提供一個方法讓我們解釋為什么要申請該權限。因此,我們可以顯示一個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對話框,第二個參數(shù)即為對話框的Message,向用戶解釋為什么申請該權限,提高用戶授權的可能性。

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

4.實現(xiàn)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(...)方法來顯示一個系統(tǒng)對話框,用以打開系統(tǒng)設置界面。

@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


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 徐闻县| 钟山县| 榕江县| 祁阳县| 武夷山市| 修武县| 保靖县| 宜章县| 梅河口市| 平度市| 长葛市| 邯郸县| 北京市| 长宁区| 江孜县| 区。| 富源县| 茶陵县| 嵩明县| 新安县| 临高县| 康马县| 泸州市| 沾化县| 西贡区| 泸州市| 克山县| 宜章县| 阳西县| 资中县| 南部县| 喜德县| 新乐市| 荆州市| 芮城县| 左贡县| 连城县| 西昌市| 莎车县| 彩票| 仪陇县|