android中动态权限的获取及处理方式

背景

在android6.0以后的更高的android版本中,为了提高用户的隐私安全,应用的权限被分为不同的组别,并且对某些敏感的权限(例如访问照片、通讯录等)需要在运行时动态授权,以提高用户隐私保护。这种方式可以使应用程序更加透明和安全,同时也保护了用户的权利。

1.普通权限

这些权限属于应用程序的基本功能范围,不会直接涉及到用户的隐私或安全问题。普通权限在应用程序安装时自动授予,并无需用户的明确许可。例如,访问互联网、读取设备状态和标识等。

android.permission.ACCESS_NETWORK_STATE:访问网络状态,包括检查网络连接是否可用和获取网络类型。

android.permission.ACCESS_WIFI_STATE:访问Wi-Fi网络状态,包括获取当前连接的Wi-Fi信息。

android.permission.BLUETOOTH:使用蓝牙功能,包括与其他蓝牙设备进行通信。

android.permission.READ_PHONE_STATE:读取设备的电话状态和标识,包括获取IMEI号码和电话号码等信息。

android.permission.RECEIVE_BOOT_COMPLETED:接收开机完成的广播,以便应用程序在设备启动时执行特定操作。

android.permission.WAKE_LOCK:防止设备进入休眠状态,以便应用程序可以在后台继续运行。

2.敏感权限

这些权限涉及到用户的个人隐私或设备的核心功能,可能对用户的数据和安全造成潜在风险。敏感权限需要在运行时动态授权,用户必须明确同意才能使用。例如,访问联系人、获取位置信息、读取短信等。

  <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

在这分别有读取音频、图片、视频的权限。在这篇文章中举例他们三个权限的申请。

3.权限申请

  • 申请详解

    我们先定义权限数组,将我们需要申请的权限放进去。

    • Manifest.permission.ACCESS_FINE_LOCATION:位置读取权限

    • Manifest.permission.CAMERA:相机使用权限

    • READ_MEDIA_AUDIO:读取音频权限

    • READ_MEDIA_IMAGES:读取图片权限

    • READ_MEDIA_VIDEO:读取视频权限

  private static String[] PERMISSIONS_STORAGE = { Manifest.permission.ACCESS_FINE_LOCATION,READ_INPUT_STATE,
Manifest.permission.CAMERA,
READ_MEDIA_IMAGES,
READ_MEDIA_AUDIO,
READ_MEDIA_VIDEO};

这个代码在oncreate方法中执行,如果没同意权限会出现权限管理窗口。

   if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP) {


            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {


                ActivityCompat.requestPermissions(this, PERMISSIONS_STORAGE, REQUEST_PERMISSION_CODE);
                Toast.makeText(this, "请允许读取权限", Toast.LENGTH_SHORT).show();
            }
        }

 

申请之后的操作:

我们重写onRequestPermissionsResult方法,对权限申请后的操作重写,自定义权限申请后置操作。

 //请求状态码
    private static int REQUEST_PERMISSION_CODE = 1;



    //权限申请后执行方法
    @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_PERMISSION_CODE) {
            int PERMISSION_CODE = 0;
                        for (int i = 0; i < permissions.length; i++) {

              Log.i("MainActivity", "申请的权限为:" + permissions[i] + ",申请结果:" + grantResults[i]);
               Log.i("MainActivity", "权限数量:" + permissions.length);

                            PERMISSION_CODE = grantResults[i];
            }
            if (PERMISSION_CODE==-1){
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("请点击确定并手动授予权限");
                builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) {
                        // 打开应用程序设置页面
                        Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                                Uri.parse("package:" + getPackageName()));
                        intent.addCategory(Intent.CATEGORY_DEFAULT);
                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent);
                    }
                });
                builder.setNegativeButton("取消", null);
                builder.show();

            }


        }
    }

当我们没有获取到权限后,打开app会检查你是否获取权限,如果没有,会出现弹窗,点击确定跳转到设置页面,以便获取权限。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值