欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android開發(fā)之permission動態(tài)權(quán)限獲取詳解

 更新時間:2022年08月15日 12:05:08   作者:yinhe888675  
這篇文章主要為大家詳細介紹了Android開發(fā)之permission動態(tài)權(quán)限獲取,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Android開發(fā)之permission動態(tài)權(quán)限獲取,供大家參考,具體內(nèi)容如下

說明

  • Android 6.0 (API 23) 之前應(yīng)用的權(quán)限在安裝時全部授予,運行時應(yīng)用不再需要詢問用戶。在 Android 6.0 或更高版本對權(quán)限進行了分類,對某些涉及到用戶隱私的權(quán)限可在運行時根據(jù)用戶的需要動態(tài)授予。這樣就不需要在安裝時被強迫同意某些權(quán)限。
  • 設(shè)備系統(tǒng)是 Android 6.0 (API 23) 或更高版本,并且應(yīng)用的 targetSdkVersion 是 23 或更高版本,則針對在 AndroidManifest.xml 中聲明的危險權(quán)限,在運行時還需要動態(tài)請求用戶授權(quán)
  • 動態(tài)權(quán)限請求相關(guān)操作的API封裝在在android.support.v4包中,發(fā)起請求權(quán)限的Activity需要直接或間接繼承android.support.v4.app.FragmentActivity。
  • 也可以在直接或間接繼承 android.support.v4.app.Fragment 的 Fragment 中發(fā)起權(quán)限請求。
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);
?? ? ? ?}
?? ??
?? ? ? ?/**
?? ? ? ? * 點擊按鈕,將通訊錄備份保存到外部存儲器備。
?? ? ? ? *
?? ? ? ? * 需要3個權(quán)限(都是危險權(quán)限):
?? ? ? ? * ? ? ?1. 讀取通訊錄權(quán)限;
?? ? ? ? * ? ? ?2. 讀取外部存儲器權(quán)限;
?? ? ? ? * ? ? ?3. 寫入外部存儲器權(quán)限.
?? ? ? ? */
?? ? ? ?public void click(View view) {
?? ? ? ? ? ?/**
?? ? ? ? ? ? * 第 1 步: 檢查是否有相應(yīng)的權(quán)限,根據(jù)自己需求,進行添加相應(yīng)的權(quán)限
?? ? ? ? ? ? */
?? ? ? ? ? ?boolean isAllGranted = checkPermissionAllGranted(
?? ? ? ? ? ? ? ? ? ?new String[] {
?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.READ_CONTACTS,
?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.READ_EXTERNAL_STORAGE,
?? ? ? ? ? ? ? ? ? ? ? ? ? ?Manifest.permission.WRITE_EXTERNAL_STORAGE
?? ? ? ? ? ? ? ? ? ?}
?? ? ? ? ? ?);
?? ? ? ? ? ?// 如果這3個權(quán)限全都擁有, 則直接執(zhí)行備份代碼
?? ? ? ? ? ?if (isAllGranted) {
?? ? ? ? ? ? ? ?doBackup();
?? ? ? ? ? ? ? ?return;
?? ? ? ? ? ?}
?? ??
?? ? ? ? ? ?/**
?? ? ? ? ? ? * 第 2 步: 請求權(quán)限
?? ? ? ? ? ? */
?? ? ? ? ? ?// 一次請求多個權(quán)限, 如果其他有權(quán)限是已經(jī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) {
?? ? ? ? ? ? ? ? ? ?// 只要有一個權(quán)限沒有被授予, 則直接返回 false
?? ? ? ? ? ? ? ? ? ?return false;
?? ? ? ? ? ? ? ?}
?? ? ? ? ? ?}
?? ? ? ? ? ?return true;
?? ? ? ?}
?? ??
?? ? ? ?/**
?? ? ? ? * 第 3 步: 申請權(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 {
?? ? ? ? ? ? ? ? ? ?// 彈出對話框告訴用戶需要權(quán)限的原因, 并引導(dǎo)用戶去應(yīng)用權(quán)限管理中手動打開權(quán)限按鈕
?? ? ? ? ? ? ? ? ? ?openAppDetails();
?? ? ? ? ? ? ? ?}
?? ? ? ? ? ?}
?? ? ? ?}
?? ??
?? ? ? ?/**
?? ? ? ? * 第 4 步: 備份通訊錄操作
?? ? ? ? */
?? ? ? ?private void doBackup() {
?? ? ? ? ? ?// 本文主旨是講解如果動態(tài)申請權(quán)限, 具體備份代碼不再展示, 就假裝備份一下
?? ? ? ? ? ?Toast.makeText(this, "正在備份通訊錄...", Toast.LENGTH_SHORT).show();
?? ? ? ?}
?? ??
?? ? ? ?/**
?? ? ? ? * 打開 APP 的詳情設(shè)置
?? ? ? ? */
?? ? ? ?private void openAppDetails() {
?? ? ? ? ? ?AlertDialog.Builder builder = new AlertDialog.Builder(this);
?? ? ? ? ? ?builder.setMessage("備份通訊錄需要訪問 “通訊錄” 和 “外部存儲器”,請到 “應(yīng)用信息 -> 權(quán)限” 中授予!");
?? ? ? ? ? ?builder.setPositiveButton("去手動授權(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();
?? ? ? ?}
?? ??
?? ?}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • android連接wifi時獲取廣播地址代碼

    android連接wifi時獲取廣播地址代碼

    本文詳細介紹android連接wifi時獲取廣播地址的方法,需要了解的朋友可以參考下,獲取對你有所幫助
    2012-12-12
  • 分析Android Choreographer源碼

    分析Android Choreographer源碼

    Choreographer的作用主要是配合Vsync,給上層App的渲染提供一個穩(wěn)定的Message處理的時機,也就是Vsync到來的時候,系統(tǒng)通過對Vsync信號周期的調(diào)整,來控制每一幀繪制操作的時機
    2021-06-06
  • 非常實用的小功能 Android應(yīng)用版本的更新實例

    非常實用的小功能 Android應(yīng)用版本的更新實例

    這篇文章主要為大家詳細介紹了一個非常實用的小功能,Android應(yīng)用版本的更新實例,感興趣的小伙伴們可以參考一下
    2016-08-08
  • NestScrollView嵌套RecyclerView實現(xiàn)淘寶首頁滑動效果

    NestScrollView嵌套RecyclerView實現(xiàn)淘寶首頁滑動效果

    這篇文章主要介紹了NestScrollView嵌套RecyclerView實現(xiàn)淘寶首頁滑動效果,主要實現(xiàn)淘寶首頁嵌套滑動,中間tab吸頂效果,以及介紹NestScrollView嵌套RecyclerView處理滑動沖突的方法,需要的朋友可以參考下
    2021-12-12
  • Android permission denied原因歸納和解決辦法

    Android permission denied原因歸納和解決辦法

    大家好,本篇文章主要講的是Android permission denied原因歸納和解決辦法,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下哦
    2021-12-12
  • Android自定義控件實現(xiàn)手勢密碼

    Android自定義控件實現(xiàn)手勢密碼

    這篇文章主要介紹了Android自定義控件實現(xiàn)手勢密碼的相關(guān)資料,實現(xiàn)手勢解鎖功能,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Android 中 ThreadLocal使用示例

    Android 中 ThreadLocal使用示例

    這篇文章主要介紹了Android 中 ThreadLocal使用示例的相關(guān)資料,這里提供示例代碼幫助大家學(xué)習理解這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • Android條紋進度條的實現(xiàn)(調(diào)整view寬度仿進度條)

    Android條紋進度條的實現(xiàn)(調(diào)整view寬度仿進度條)

    這篇文章主要給大家介紹了關(guān)于Android實現(xiàn)條紋進度條的方法,主要是通過調(diào)整view寬度仿進度條,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學(xué)習價值,需要的朋友們下面來一起看看吧
    2018-09-09
  • 淺析Android手機衛(wèi)士手機定位的原理

    淺析Android手機衛(wèi)士手機定位的原理

    手機定位的三種方式:網(wǎng)絡(luò)定位,基站定位,GPS定位。本文給大家介紹Android手機衛(wèi)士手機定位的原理,感興趣的朋友一起學(xué)習吧
    2016-04-04
  • Android設(shè)備與外接U盤實現(xiàn)數(shù)據(jù)讀取操作的示例

    Android設(shè)備與外接U盤實現(xiàn)數(shù)據(jù)讀取操作的示例

    本篇文章主要介紹了Android設(shè)備與外接U盤實現(xiàn)數(shù)據(jù)讀取操作的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論