首页 > 其他分享 >Android 动态申请 权限 permission

Android 动态申请 权限 permission

时间:2023-11-24 11:03:10浏览次数:29  
标签:permission private TAG activity import Android 权限 android



文章目录

  • 1、单个权限动态申请
  • 1)文件结构
  • 2) 在 AndroidManifest.xml 添加权限
  • 3)在代码里进行权限检查 和 申请
  • 2、多个权限 动态申请
  • 1) 在 AndroidManifest.xml 添加权限
  • 2)、CheckPermission文件
  • 3) 在 MainActivity 文件里面调用 CheckPermission


1、单个权限动态申请

以SD 卡读写 权限 为例

1)文件结构

Android 动态申请 权限 permission_permission

2) 在 AndroidManifest.xml 添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3)在代码里进行权限检查 和 申请
package com.example.lum.myapplicationpermission;

import android.Manifest;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {
    private String TAG = "MainActivity: ";
    private final int REQUESTCODE = 100;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        checkPermission();
    }


    //sd 卡权限检查
    private void checkPermission() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            Log.i(TAG,"没有权限进行申请");
            ActivityCompat.requestPermissions(this, new String[]
                    {Manifest.permission.WRITE_EXTERNAL_STORAGE},REQUESTCODE);
        } else {
            Log.i(TAG,"已经有权限");
        }
    }



    //sd 卡权限申请
    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        if(requestCode == REQUESTCODE){
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i(TAG,"用户同意权限申请");
            } else {
                Log.i(TAG,"用户不同意权限申请");
            }
        }
    }
}

Android 动态申请 权限 permission_数组_02

2、多个权限 动态申请

为了方便多个权限申请,以及较少代码的耦合度,我们提炼出一个类住专门用于申请权限

代码结构如下:

Android 动态申请 权限 permission_ide_03

1) 在 AndroidManifest.xml 添加权限
<!--读取联系人的权限-->
    <uses-permission android:name="android.permission.WRITE_CONTACTS" />
    <!--写联系人的权限-->
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.CALL_PHONE" />
2)、CheckPermission文件
package myapplication.lum.com.myloadercontext;

import android.Manifest;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class CheckPermission  extends  Activity{
    private String TAG = "TAG_ ";
    private  Activity activity;
   private AlertDialog mPermissionDialog;
    private String mPackName ;  //获取 a'p'k 包名
    private List<String> unPermissionList = new ArrayList<String>(); //申请未得到授权的权限列表
    private final int RequestCode = 100;//权限请求码
    private String[] permissionList = new String[]{     //申请的权限列表
            Manifest.permission.WRITE_CONTACTS,
            Manifest.permission.READ_CONTACTS,
            Manifest.permission.CALL_PHONE
    };
    public  CheckPermission(Activity activity){
        this.activity = activity;
    }

    //权限判断和申请
    public void checkPermissionExe() {
        mPackName = activity.getPackageName();
        unPermissionList.clear();//清空申请的没有通过的权限
        //逐个判断是否还有未通过的权限
        for (int i = 0; i < permissionList.length; i++) {
            if (ContextCompat.checkSelfPermission(activity, permissionList[i]) !=
                    PackageManager.PERMISSION_GRANTED) {
                unPermissionList.add(permissionList[i]);//添加还未授予的权限到unPermissionList中
            }
        }

        //有权限没有通过,需要申请
        if (unPermissionList.size() > 0) {
            ActivityCompat.requestPermissions( activity,permissionList, RequestCode);
            Log.i(TAG, "check 有权限未通过");
        } else {
            //权限已经都通过了,可以将程序继续打开了
            Log.i(TAG, "check 权限都已经申请通过");
        }
    }


    /**
     * 5.请求权限后回调的方法
     *
     * @param requestCode  是我们自己定义的权限请求码
     * @param permissions  是我们请求的权限名称数组
     * @param grantResults 是我们在弹出页面后是否允许权限的标识数组,数组的长度对应的是权限
     *                     名称数组的长度,数组的数据0表示允许权限,-1表示我们点击了禁止权限
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                           int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        Log.i(TAG,"申请结果反馈");
        boolean hasPermissionDismiss = false;
        if (RequestCode == requestCode) {
            for (int i = 0; i < grantResults.length; i++) {
                if (grantResults[i] == -1) {
                    hasPermissionDismiss = true; //有权限没有通过
                    Log.i(TAG,"有权限没有被通过");
                    break;
                }
            }
        }
        if (hasPermissionDismiss) {//如果有没有被允许的权限
            showPermissionDialog();
        } else {
            //权限已经都通过了,可以将程序继续打开了
            Log.i(TAG, "onRequestPermissionsResult 权限都已经申请通过");
        }
    }


    /**
     * 不再提示权限时的展示对话框
     */

    private void showPermissionDialog() {
        if (mPermissionDialog == null) {
            mPermissionDialog = new AlertDialog.Builder(activity)
                    .setMessage("已禁用权限,请手动授予")
                    .setPositiveButton("设置", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            cancelPermissionDialog();

                            Uri packageURI = Uri.parse("package:" + mPackName);     //去设置里面设置
                            Intent intent = new Intent(Settings.
                                    ACTION_APPLICATION_DETAILS_SETTINGS, packageURI);
                            activity.startActivity(intent);
                        }
                    })
                    .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //关闭页面或者做其他操作
                            cancelPermissionDialog();
                        }
                    })
                    .create();
        }
        mPermissionDialog.show();

    }

    private void cancelPermissionDialog() {
        mPermissionDialog.cancel();
    }

}
3) 在 MainActivity 文件里面调用 CheckPermission
···· 省略
  @Override
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        CheckPermission checkPermission = new CheckPermission(this); //实例化 CheckPermission 对象,并传递当前 activity  
        checkPermission.checkPermissionExe(); //调用方法执行 权限检查
                ·····省略
        }

这样当我们 需要添加动态权限的时候,只需要添加 CheckPermission 文件,并且添加相应权限即可。

文章参考:
每日一记—Android动态申请多个权限

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势


标签:permission,private,TAG,activity,import,Android,权限,android
From: https://blog.51cto.com/u_15866638/8546134

相关文章

  • Android典型技术模块开发详解 pdf 资料
    文章目录1、介绍2、章节介绍1、介绍Android典型技术模块开发详解适合刚步入Android开发的工作者,对于Android各个模块能够很好、很全面的讲解。2、章节介绍Android典型技术模块开发详解pdfAndroid典型技术模块开发详解代码文献参考:《Android典型技术模块开发详解》......
  • Android MVC 模式的介绍 与 实战
    文章目录1、mvc框架图2、MVC在Android模式里的实现4、小结1、mvc框架图经典的mvc模式如图所示1)Model(模型层)在MVC中Model一般用来保存数据的状态,比如数据存储,网络请求。同时还与View存在一定的耦合,通过某种事件机制(比如观察者模式)通知View状态的改变来让view更......
  • Android 抽象工厂模式
    文章目录1、抽象工厂模式介绍2、抽象工厂模式的定义3、抽象工厂模式的使用场景4、抽象工厂模式的简单实现5、小结1、抽象工厂模式介绍抽象工厂模式也是创建型模式之一,抽象工厂模式起源于对不同操作系统的图形化解决方案,如不同操作系统的按钮和文本框控件及其实现。2、抽象工厂模......
  • Android 工厂方法模式
    文章目录1、工厂方法模式介绍2、工厂方法模式的定义3、使用场景4、模式的简单实现1、工厂方法模式介绍工厂方法模式(FactoryPattern),是创建型设计模式之一。工厂方法模式是一个结构比较简单的模式。2、工厂方法模式的定义就是一个用于创建对象的接口,让子类来决定实体化那个类。3......
  • Android 单例模式
    文章目录1、单例模式介绍2、单例模式的简单例子3、懒汉模式实现单例模式4、DoubleCheckLock(DLC)实现单例5、静态内部类单例模式6、枚举单例7、使用容器是实现单例模式1、单例模式介绍据说在一个app中,单例对象的类必须保证只有一个实例存在,系统只有一个全局变量存在。2、单......
  • Android Studio常见问题的解决
    真机调试显示安装包异常在gradle.properties文件最后面加上这一行代码android.injected.testOnly=false以及选择合适的AGP版本,例如选择7.1.2版本,这个版本号可以在build.gradle文件里面修改。gradle下载缓慢的问题在网络防火墙->允许应用通过防火墙->将AndroidStudio添加......
  • linux文件权限2
    基本权限ACLACL主要提供传统的UGO的r,w,x权限之外的具体权限,可以对单一用户,单一文件,或者目录进行文件权限设置ACL的基本使用方式getfacl查看权限setfacl设置权限选项-m 设定ACL的权限-x 删除某一用户或组的ACL权限-......
  • Android深入学习之ComponentActivity.registerForActivityResult()方法
    ComponentActivity.startActivityForResult()和ComponentActivity.onActivityResult()已经废弃,如下图所示,取而代之的是统一它俩的ActivityResultLauncher。  ActivityResultLauncher对象可以通过ComponentActivity.registerForActivityResult()方法获取。该方法有两个重载。......
  • Linux文件权限
    一、文件权限文件的权限针对三类对象进行定义owner属主,缩写ugroup属组,缩写gother其他,缩写o每个文件针对每类访问者定义了三种主要权限r:Read读w:Write写x:eXecute执行对于文件和目录来说,r,w,x有着不同的作用和含义:针对文件:r:读取文件内容w:修改文件内容x:执行......
  • springboot 集成swagger3.0 并开启权限认证
    1.POM文件只需要引入一个依赖即可  2.swagger配置文件如下注意:要添加“@EnableWebMvc"注解,详细代码如下:@Configuration@EnableWebMvcpublicclassSwaggerConfig{@Value("${swagger.enabled}")booleanenabled;@BeanpublicDocketdocket(){r......