首页 > 其他分享 >2023年3月17日(软件工程日报)

2023年3月17日(软件工程日报)

时间:2023-03-17 21:59:44浏览次数:42  
标签:17 App 开启 软件工程 requestCode 2023 权限 方法 代码

访问公共空间 1.检查App是否开启了指定权限 权限检查需要调用ContextCompat的checkSelfPermission方法,该方法的第一个参数为活动实例,第 二个参数为待检查的权限名称,例如存储卡的写权限名为 Manifest.permission.WRITE_EXTERNAL_STORAGE。注意checkSelfPermission方法的返回值,当它为 PackageManager.PERMISSION_GRANTED时表示已经授权,否则就是未获授权。 2.请求系统弹窗,以便用户选择是否开启权限 一旦发现某个权限尚未开启,就得弹窗提示用户手工开启,这个弹窗不是开发者自己写的提醒对话框, 而是系统专门用于权限申请的对话框。调用ActivityCompat的requestPermissions方法,即可命令系统 自动弹出权限申请窗口,该方法的第一个参数为活动实例,第二个参数为待申请的权限名称数组,第三 个参数为本次操作的请求代码。 3.判断用户的权限选择结果 然而上面第二步的requestPermissions方法没有返回值,那怎么判断用户到底选了开启权限还是拒绝权 限呢?其实活动页面提供了权限选择的回调方法onRequestPermissionsResult,如果当前页面请求弹出 权限申请窗口,那么该页面的Java代码必须重写onRequestPermissionsResult方法,并在该方法内部处 理用户的权限选择结果。 具体到编码实现上,前两步的权限校验和请求弹窗可以合并到一块,先调用checkSelfPermission方法检 查某个权限是否已经开启,如果没有开启再调用requestPermissions方法请求系统弹窗。合并之后的检 查方法代码示例如下,此处代码支持一次检查一个权限,也支持一次检查多个权限: (完整代码见chapter07\src\main\java\com\example\chapter07\util\PermissionUtil.java) // 检查某个权限。返回true表示已启用该权限,返回false表示未启用该权限 public static boolean checkPermission(Activity act, String permission, int requestCode) { return checkPermission(act, new String[]{permission}, requestCode); } // 检查多个权限。返回true表示已完全启用权限,返回false表示未完全启用权限 public static boolean checkPermission(Activity act, String[] permissions, int requestCode) { boolean result = true; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { int check = PackageManager.PERMISSION_GRANTED; // 通过权限数组检查是否都开启了这些权限 for (String permission : permissions) { check = ContextCompat.checkSelfPermission(act, permission); if (check != PackageManager.PERMISSION_GRANTED) { break; // 有个权限没有开启,就跳出循环 } } if (check != PackageManager.PERMISSION_GRANTED) { // 未开启该权限,则请求系统弹窗,好让用户选择是否立即开启权限 ActivityCompat.requestPermissions(act, permissions, requestCode); result = false; } } return result; }注意到上面代码有判断安卓版本号,只有系统版本大于Android 6.0(版本代号为M),才执行后续的权 限校验操作。这是因为从Android 6.0开始引入了运行时权限机制,在Android 6.0之前,只要App在 AndroidManifest.xml中添加了权限配置,则系统会自动给App开启相关权限;但在Android 6.0之后, 即便事先添加了权限配置,系统也不会自动开启权限,而要开发者在App运行时判断权限的开关情况, 再据此动态申请未获授权的权限。 回到活动页面代码,一方面增加权限校验入口,比如点击某个按钮后触发权限检查操作,其中 Manifest.permission.WRITE_EXTERNAL_STORAGE表示存储卡权限,入口代码如下: (完整代码见chapter07\src\main\java\com\example\chapter07\MainActivity.java) if (v.getId() == R.id.btn_file_write) { if (PermissionUtil.checkPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE, R.id.btn_file_write % 65536)) { startActivity(new Intent(this, FileWriteActivity.class)); } } 另一方面还要重写活动的onRequestPermissionsResult方法,在方法内部校验用户的选择结果,若用户 同意授权,就执行后续业务;若用户拒绝授权,只能提示用户无法开展后续业务了。重写后的方法代码 如下所示: @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // requestCode不能为负数,也不能大于2的16次方即65536 if (requestCode == R.id.btn_file_write % 65536) { if (PermissionUtil.checkGrant(grantResults)) { // 用户选择了同意授权 startActivity(new Intent(this, FileWriteActivity.class)); } else { ToastUtil.show(this, "需要允许存储卡权限才能写入公共空间噢"); } } } 以上代码为了简化逻辑,将结果校验操作封装为PermissionUtil的checkGrant方法,该方法遍历授权结 果数组,依次检查每个权限是否都得到授权了。详细的方法代码如下所示: // 检查权限结果数组,返回true表示都已经获得授权。返回false表示至少有一个未获得授权 public static boolean checkGrant(int[] grantResults) { boolean result = true; if (grantResults != null) { for (int grant : grantResults) { // 遍历权限结果数组中的每条选择结果 if (grant != PackageManager.PERMISSION_GRANTED) { // 未获得授权 result = false; } } } else { result = false; } return result; }代码都改好后,运行测试App,由于一开始App默认未开启存储卡权限,因此点击按钮btn_file_write触 发了权限校验操作,弹出如图7-4所示的存储卡权限申请窗口。 点击弹窗上的“始终允许”,表示同意赋予存储卡读写权限,然后系统自动给App开启了存储卡权限,并执 行后续处理逻辑,也就是跳到了FileWriteActivity页面,在该页面即可访问公共空间的文件了。但在 Android 10系统中,即使授权通过,App仍然无法访问公共空间,这是因为Android 10默认开启沙箱模 式,不允许直接使用公共空间的文件路径,此时要修改AndroidManifest.xml,给application节点添加 如下的requestLegacyExternalStorage属性: android:requestLegacyExternalStorage="true" 从Android 11开始,为了让应用升级时也能正常访问公共空间,还得修改AndroidManifest.xml,给 application节点添加如下的preserveLegacyExternalStorage属性,表示暂时关闭沙箱模式: android:preserveLegacyExternalStorage="true"

标签:17,App,开启,软件工程,requestCode,2023,权限,方法,代码
From: https://www.cnblogs.com/ewqewq/p/17228272.html

相关文章

  • 2023/03/15刷题
    B.SorttheArray链接B.SorttheArray这个题原本也是不会然后看了别人的题解,以及学长给了一个思路学长给的思路就是找到最长的可以翻转的区间然后把这个区间翻转过......
  • 2023/03/12刷题
    A.ApplemanandToastman链接A.ApplemanandToastman这个题要计算最大值所以我们肯定直接,每次都减少最少的那个,然后使用一个变量每次把值加上最后打印出来结果就可......
  • 2023/03/13刷题
    C.BoxesPacking链接C.BoxesPacking这个题就是找相同的数字的最大值.因为每一个数字都要放在一个盒子里面打印就可以#include<iostream>#include<algorithm>#i......
  • 2023/03/14刷题
    A.IQtest链接A.IQtest这个题就是给一个数数组,数组有两种情况。要么有n-1个奇数和一个偶数要么有n-1个偶数和一个奇数让我们求出这一个奇数和一个偶数所在数组......
  • 每日总结 3.17
    今天完成了web课程的实验报告一后,继续对查询线路的显示进行了优化处理。页面不会在查询之前显示null,使用foreach进行集合遍历。<%@pagelanguage="java"contentType="......
  • 3.17
    今天我们讨论了该如何快速遍历地铁的所有车站,由于地铁图过于复杂,再加上今天课很多,因此我们目前还没有商量出结果,根据网上内容,我推测出要使用欧拉回路算法,这部分算法对我们......
  • 20230317
    数据结构remake第一天线性表的操作////babyDataStructrue.cpp//dataStructure////Createdbyon2023/3/17.#include<stdio.h>#defineN10#defineMAX20......
  • 3.17学习总结
    今天上web课上机实验学会了网页html的制作实验代码如下<!DOCTYPE html><html>    <head>        <title>信2105-3尹亚博个人主页</title>      ......
  • 2023-Q1 公众号内容全部整合到 Github 啦
    项目地址:https://github.com/duanbiaowu/go-examples-for-beginners......
  • 4月扬州 | 2023年易智瑞遥感应用培训班报名开启
    传递遥感技术助力遥感应用2023年易智瑞遥感应用培训班—4月扬州站 主办单位易智瑞信息技术有限公司培训简介遥感应用培训班自2009年启动以来,......