Android開發(fā)之permission動(dòng)態(tài)權(quán)限獲取詳解
Android開發(fā)之permission動(dòng)態(tài)權(quán)限獲取,供大家參考,具體內(nèi)容如下
說(shuō)明
- Android 6.0 (API 23) 之前應(yīng)用的權(quán)限在安裝時(shí)全部授予,運(yùn)行時(shí)應(yīng)用不再需要詢問(wèn)用戶。在 Android 6.0 或更高版本對(duì)權(quán)限進(jìn)行了分類,對(duì)某些涉及到用戶隱私的權(quán)限可在運(yùn)行時(shí)根據(jù)用戶的需要?jiǎng)討B(tài)授予。這樣就不需要在安裝時(shí)被強(qiáng)迫同意某些權(quán)限。
- 設(shè)備系統(tǒng)是 Android 6.0 (API 23) 或更高版本,并且應(yīng)用的 targetSdkVersion 是 23 或更高版本,則針對(duì)在 AndroidManifest.xml 中聲明的危險(xiǎn)權(quán)限,在運(yùn)行時(shí)還需要?jiǎng)討B(tài)請(qǐng)求用戶授權(quán)
- 動(dòng)態(tài)權(quán)限請(qǐng)求相關(guān)操作的API封裝在在android.support.v4包中,發(fā)起請(qǐng)求權(quán)限的Activity需要直接或間接繼承android.support.v4.app.FragmentActivity。
- 也可以在直接或間接繼承 android.support.v4.app.Fragment 的 Fragment 中發(fā)起權(quán)限請(qǐng)求。
package com.xiets.demoapp; import android.Manifest; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; import android.os.Bundle; import android.provider.Settings; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast; ?? ?? ?? ?/** ?? ? * 一鍵備份通訊錄 ?? ? * ?? ? * @author xietansheng ?? ? */ ?? ?public class MainActivity extends AppCompatActivity { ?? ?? ?? ? ? ?private static final int MY_PERMISSION_REQUEST_CODE = 10000; ?? ?? ?? ? ? ?@Override ?? ? ? ?protected void onCreate(Bundle savedInstanceState) { ?? ? ? ? ? ?super.onCreate(savedInstanceState); ?? ? ? ? ? ?setContentView(R.layout.activity_main); ?? ? ? ?} ?? ?? ?? ? ? ?/** ?? ? ? ? * 點(diǎn)擊按鈕,將通訊錄備份保存到外部存儲(chǔ)器備。 ?? ? ? ? * ?? ? ? ? * 需要3個(gè)權(quán)限(都是危險(xiǎn)權(quán)限): ?? ? ? ? * ? ? ?1. 讀取通訊錄權(quán)限; ?? ? ? ? * ? ? ?2. 讀取外部存儲(chǔ)器權(quán)限; ?? ? ? ? * ? ? ?3. 寫入外部存儲(chǔ)器權(quán)限. ?? ? ? ? */ ?? ? ? ?public void click(View view) { ?? ? ? ? ? ?/** ?? ? ? ? ? ? * 第 1 步: 檢查是否有相應(yīng)的權(quán)限,根據(jù)自己需求,進(jìn)行添加相應(yīng)的權(quán)限 ?? ? ? ? ? ? */ ?? ? ? ? ? ?boolean isAllGranted = checkPermissionAllGranted( ?? ? ? ? ? ? ? ? ? ?new String[] { ?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.READ_CONTACTS, ?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.READ_EXTERNAL_STORAGE, ?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.WRITE_EXTERNAL_STORAGE ?? ? ? ? ? ? ? ? ? ?} ?? ? ? ? ? ?); ?? ? ? ? ? ?// 如果這3個(gè)權(quán)限全都擁有, 則直接執(zhí)行備份代碼 ?? ? ? ? ? ?if (isAllGranted) { ?? ? ? ? ? ? ? ?doBackup(); ?? ? ? ? ? ? ? ?return; ?? ? ? ? ? ?} ?? ?? ?? ? ? ? ? ?/** ?? ? ? ? ? ? * 第 2 步: 請(qǐng)求權(quán)限 ?? ? ? ? ? ? */ ?? ? ? ? ? ?// 一次請(qǐng)求多個(gè)權(quán)限, 如果其他有權(quán)限是已經(jīng)授予的將會(huì)自動(dòng)忽略掉 ?? ? ? ? ? ?ActivityCompat.requestPermissions( ?? ? ? ? ? ? ? ? ? ?this, ?? ? ? ? ? ? ? ? ? ?new String[] { ?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.READ_CONTACTS, ?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.READ_EXTERNAL_STORAGE, ?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.WRITE_EXTERNAL_STORAGE ?? ? ? ? ? ? ? ? ? ?}, ?? ? ? ? ? ? ? ? ? ?MY_PERMISSION_REQUEST_CODE ?? ? ? ? ? ?); ?? ? ? ?} ?? ?? ?? ? ? ?/** ?? ? ? ? * 檢查是否擁有指定的所有權(quán)限 ?? ? ? ? */ ?? ? ? ?private boolean checkPermissionAllGranted(String[] permissions) { ?? ? ? ? ? ?for (String permission : permissions) { ?? ? ? ? ? ? ? ?if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { ?? ? ? ? ? ? ? ? ? ?// 只要有一個(gè)權(quán)限沒(méi)有被授予, 則直接返回 false ?? ? ? ? ? ? ? ? ? ?return false; ?? ? ? ? ? ? ? ?} ?? ? ? ? ? ?} ?? ? ? ? ? ?return true; ?? ? ? ?} ?? ?? ?? ? ? ?/** ?? ? ? ? * 第 3 步: 申請(qǐng)權(quán)限結(jié)果返回處理 ?? ? ? ? */ ?? ? ? ?@Override ?? ? ? ?public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { ?? ? ? ? ? ?super.onRequestPermissionsResult(requestCode, permissions, grantResults); ?? ?? ?? ? ? ? ? ?if (requestCode == MY_PERMISSION_REQUEST_CODE) { ?? ? ? ? ? ? ? ?boolean isAllGranted = true; ?? ?? ?? ? ? ? ? ? ? ?// 判斷是否所有的權(quán)限都已經(jīng)授予了 ?? ? ? ? ? ? ? ?for (int grant : grantResults) { ?? ? ? ? ? ? ? ? ? ?if (grant != PackageManager.PERMISSION_GRANTED) { ?? ? ? ? ? ? ? ? ? ? ? ?isAllGranted = false; ?? ? ? ? ? ? ? ? ? ? ? ?break; ?? ? ? ? ? ? ? ? ? ?} ?? ? ? ? ? ? ? ?} ?? ?? ?? ? ? ? ? ? ? ?if (isAllGranted) { ?? ? ? ? ? ? ? ? ? ?// 如果所有的權(quán)限都授予了, 則執(zhí)行備份代碼 ?? ? ? ? ? ? ? ? ? ?doBackup(); ?? ?? ?? ? ? ? ? ? ? ?} else { ?? ? ? ? ? ? ? ? ? ?// 彈出對(duì)話框告訴用戶需要權(quán)限的原因, 并引導(dǎo)用戶去應(yīng)用權(quán)限管理中手動(dòng)打開權(quán)限按鈕 ?? ? ? ? ? ? ? ? ? ?openAppDetails(); ?? ? ? ? ? ? ? ?} ?? ? ? ? ? ?} ?? ? ? ?} ?? ?? ?? ? ? ?/** ?? ? ? ? * 第 4 步: 備份通訊錄操作 ?? ? ? ? */ ?? ? ? ?private void doBackup() { ?? ? ? ? ? ?// 本文主旨是講解如果動(dòng)態(tài)申請(qǐng)權(quán)限, 具體備份代碼不再展示, 就假裝備份一下 ?? ? ? ? ? ?Toast.makeText(this, "正在備份通訊錄...", Toast.LENGTH_SHORT).show(); ?? ? ? ?} ?? ?? ?? ? ? ?/** ?? ? ? ? * 打開 APP 的詳情設(shè)置 ?? ? ? ? */ ?? ? ? ?private void openAppDetails() { ?? ? ? ? ? ?AlertDialog.Builder builder = new AlertDialog.Builder(this); ?? ? ? ? ? ?builder.setMessage("備份通訊錄需要訪問(wèn) “通訊錄” 和 “外部存儲(chǔ)器”,請(qǐng)到 “應(yīng)用信息 -> 權(quán)限” 中授予!"); ?? ? ? ? ? ?builder.setPositiveButton("去手動(dòng)授權(quán)", new DialogInterface.OnClickListener() { ?? ? ? ? ? ? ? ?@Override ?? ? ? ? ? ? ? ?public void onClick(DialogInterface dialog, int which) { ?? ? ? ? ? ? ? ? ? ?Intent intent = new Intent(); ?? ? ? ? ? ? ? ? ? ?intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); ?? ? ? ? ? ? ? ? ? ?intent.addCategory(Intent.CATEGORY_DEFAULT); ?? ? ? ? ? ? ? ? ? ?intent.setData(Uri.parse("package:" + getPackageName())); ?? ? ? ? ? ? ? ? ? ?intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ?? ? ? ? ? ? ? ? ? ?intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); ?? ? ? ? ? ? ? ? ? ?intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); ?? ? ? ? ? ? ? ? ? ?startActivity(intent); ?? ? ? ? ? ? ? ?} ?? ? ? ? ? ?}); ?? ? ? ? ? ?builder.setNegativeButton("取消", null); ?? ? ? ? ? ?builder.show(); ?? ? ? ?} ?? ?? ?? ?}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android運(yùn)行時(shí)權(quán)限終極方案(PermissionX)
- Android超清晰6.0權(quán)限申請(qǐng)AndPermission
- Android權(quán)限HaloPermission詳細(xì)使用
- android6.0權(quán)限動(dòng)態(tài)申請(qǐng)框架permissiondispatcher的方法
- Android EasyPermissions官方庫(kù)高效處理權(quán)限相關(guān)教程
- Android.permission.MODIFY_PHONE_STATE權(quán)限問(wèn)題解決辦法
- 詳解Android權(quán)限管理之RxPermission解決Android 6.0 適配問(wèn)題
- Android權(quán)限管理之Permission權(quán)限機(jī)制及使用詳解
- Android權(quán)限操作之uses-permission詳解
- Android 權(quán)限(permission)整理
相關(guān)文章
非常實(shí)用的小功能 Android應(yīng)用版本的更新實(shí)例
這篇文章主要為大家詳細(xì)介紹了一個(gè)非常實(shí)用的小功能,Android應(yīng)用版本的更新實(shí)例,感興趣的小伙伴們可以參考一下2016-08-08NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁(yè)滑動(dòng)效果
這篇文章主要介紹了NestScrollView嵌套R(shí)ecyclerView實(shí)現(xiàn)淘寶首頁(yè)滑動(dòng)效果,主要實(shí)現(xiàn)淘寶首頁(yè)嵌套滑動(dòng),中間tab吸頂效果,以及介紹NestScrollView嵌套R(shí)ecyclerView處理滑動(dòng)沖突的方法,需要的朋友可以參考下2021-12-12Android permission denied原因歸納和解決辦法
大家好,本篇文章主要講的是Android permission denied原因歸納和解決辦法,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下哦2021-12-12Android自定義控件實(shí)現(xiàn)手勢(shì)密碼
這篇文章主要介紹了Android自定義控件實(shí)現(xiàn)手勢(shì)密碼的相關(guān)資料,實(shí)現(xiàn)手勢(shì)解鎖功能,感興趣的小伙伴們可以參考一下2016-07-07Android條紋進(jìn)度條的實(shí)現(xiàn)(調(diào)整view寬度仿進(jìn)度條)
這篇文章主要給大家介紹了關(guān)于Android實(shí)現(xiàn)條紋進(jìn)度條的方法,主要是通過(guò)調(diào)整view寬度仿進(jìn)度條,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-09-09淺析Android手機(jī)衛(wèi)士手機(jī)定位的原理
手機(jī)定位的三種方式:網(wǎng)絡(luò)定位,基站定位,GPS定位。本文給大家介紹Android手機(jī)衛(wèi)士手機(jī)定位的原理,感興趣的朋友一起學(xué)習(xí)吧2016-04-04Android設(shè)備與外接U盤實(shí)現(xiàn)數(shù)據(jù)讀取操作的示例
本篇文章主要介紹了Android設(shè)備與外接U盤實(shí)現(xiàn)數(shù)據(jù)讀取操作的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11