广告位联系
返回顶部
分享到

Android开发之permission动态权限获取介绍

Android 来源:互联网 作者:F11站长开发者 发布时间:2022-08-15 17:27:23 人浏览
摘要

说明 Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在运行时根据用户

说明

  • Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户。在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在运行时根据用户的需要动态授予。这样就不需要在安装时被强迫同意某些权限。
  • 设备系统是 Android 6.0 (API 23) 或更高版本,并且应用的 targetSdkVersion 是 23 或更高版本,则针对在 AndroidManifest.xml 中声明的危险权限,在运行时还需要动态请求用户授权
  • 动态权限请求相关操作的API封装在在android.support.v4包中,发起请求权限的Activity需要直接或间接继承android.support.v4.app.FragmentActivity。
  • 也可以在直接或间接继承 android.support.v4.app.Fragment 的 Fragment 中发起权限请求。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

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个权限(都是危险权限):

         *      1. 读取通讯录权限;

         *      2. 读取外部存储器权限;

         *      3. 写入外部存储器权限.

         */

        public void click(View view) {

            /**

             * 第 1 步: 检查是否有相应的权限,根据自己需求,进行添加相应的权限

             */

            boolean isAllGranted = checkPermissionAllGranted(

                    new String[] {

                            Manifest.permission.READ_CONTACTS,

                            Manifest.permission.READ_EXTERNAL_STORAGE,

                            Manifest.permission.WRITE_EXTERNAL_STORAGE

                    }

            );

            // 如果这3个权限全都拥有, 则直接执行备份代码

            if (isAllGranted) {

                doBackup();

                return;

            }

      

            /**

             * 第 2 步: 请求权限

             */

            // 一次请求多个权限, 如果其他有权限是已经授予的将会自动忽略掉

            ActivityCompat.requestPermissions(

                    this,

                    new String[] {

                            Manifest.permission.READ_CONTACTS,

                            Manifest.permission.READ_EXTERNAL_STORAGE,

                            Manifest.permission.WRITE_EXTERNAL_STORAGE

                    },

                    MY_PERMISSION_REQUEST_CODE

            );

        }

      

        /**

         * 检查是否拥有指定的所有权限

         */

        private boolean checkPermissionAllGranted(String[] permissions) {

            for (String permission : permissions) {

                if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {

                    // 只要有一个权限没有被授予, 则直接返回 false

                    return false;

                }

            }

            return true;

        }

      

        /**

         * 第 3 步: 申请权限结果返回处理

         */

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

      

                // 判断是否所有的权限都已经授予了

                for (int grant : grantResults) {

                    if (grant != PackageManager.PERMISSION_GRANTED) {

                        isAllGranted = false;

                        break;

                    }

                }

      

                if (isAllGranted) {

                    // 如果所有的权限都授予了, 则执行备份代码

                    doBackup();

      

                } else {

                    // 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮

                    openAppDetails();

                }

            }

        }

      

        /**

         * 第 4 步: 备份通讯录操作

         */

        private void doBackup() {

            // 本文主旨是讲解如果动态申请权限, 具体备份代码不再展示, 就假装备份一下

            Toast.makeText(this, "正在备份通讯录...", Toast.LENGTH_SHORT).show();

        }

      

        /**

         * 打开 APP 的详情设置

         */

        private void openAppDetails() {

            AlertDialog.Builder builder = new AlertDialog.Builder(this);

            builder.setMessage("备份通讯录需要访问 “通讯录” 和 “外部存储器”,请到 “应用信息 -> 权限” 中授予!");

            builder.setPositiveButton("去手动授权", 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();

        }

      

    }


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/yinhe888675/article/details/120881544
相关文章
  • Kotlin的Collection与Sequence操作异同点介绍

    Kotlin的Collection与Sequence操作异同点介绍
    在Android开发中,集合是我们必备的容器,Kotlin的标准库中提供了很多处理集合的方法,而且还提供了两种基于容器的工作方式:Collection 和
  • 实现一个Kotlin函数类型方法

    实现一个Kotlin函数类型方法
    接口与函数类型 业务开发中,经常会有实现一个函数式接口(即接口只有一个方法需要实现)的场景,大家应该都会不假思索的写出如下代
  • Android10 App启动Activity源码分析
    ActivityThread的main方法 让我们把目光聚焦到ActivityThread的main方法上。 ActivityThread的源码路径为/frameworks/base/core/java/android/app/ActivityThread。 1 2
  • Android10客户端事务管理ClientLifecycleManager源码解析

    Android10客户端事务管理ClientLifecycleManager源码解析
    在Android 10 App启动分析之Activity启动篇(二)一文中,简单地介绍了Activity的生命周期管理器是如何调度Activity进入onCreate生命周期的流程。这
  • Kotlin对象的懒加载方式by lazy与lateinit异同介绍

    Kotlin对象的懒加载方式by lazy与lateinit异同介绍
    属性或对象的延时加载是我们相当常用的,一般我们都是使用 lateinit 和 by lazy 来实现。 他们两者都是延时初始化,那么在使用时那么他们两
  • Android类加载流程分析

    Android类加载流程分析
    本文分析的代码基于Android8.1.0源码。 流程分析 从loadClass开始,我们来看下Android中类加载的流程 /libcore/ojluni/src/main/java/java/lang/ClassLoader.ja
  • Android实现读写USB串口数据的代码

    Android实现读写USB串口数据的代码
    最近在研究USB方面的内容;先后做了关于Android读写HID、串口设备的DEMO。本文比较简单,主要介绍的是Android实现读取串口数据的功能 废话不
  • Epoxy - 在RecyclerView中构建复杂界面
    Diffing 对于复杂数据结构支持的多个视图类型展示在屏幕上, Epoxy此时是尤其有用的. 在这些场景中, 数据可能会被网络请求, 异步 Observable, 用
  • Android性能优化的详细介绍

    Android性能优化的详细介绍
    性能优化是一个app很重要的一部分,一个性能优良的app从被下载到启动到使用都能给用户到来很好的体验。自然我们做性能优化也是从被下
  • Android进阶宝典-插件化2(Hook启动插件中四大组件

    Android进阶宝典-插件化2(Hook启动插件中四大组件
    在上一节,我们主要介绍了如果通过反射来加载插件中的类,调用类中的方法;既然插件是一个apk,其实最重要的是启动插件中的Activity、
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计