Android在fragment中请求权限后onRequestPermissionsResult没有被执行

Android上有的权限需要手动申请权限的,比如android.permission.READ_CONTACTS。 即使你在AndroidManifest.xml中已经声明了也不行 <uses-permission android:name="android.permission.READ_CONTACTS" /> 问题原因 这是android6.0以后的要求,要求程序自行手动申请权限。 场景示例 比如我的应用点击某个按钮之后需要读取联系人列表,待用户选择某个具体联系人后需要读取该联系人的电话号码,这步操作是需要android.permission.READ_CONTACTS权限的。 我们需要在执行到必要步骤时判断是否拥有权限,没有的话让用户授权 if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_CONTACTS)) { // 直接执行 } else { // 请求用户授权 } 实践过程 在网上很多文章也给的方式是这样的 ActivityCompat.requestPermissions(this.getActivity(), arrayOf(Manifest.permission.READ_CONTACTS), MY_PERMISSIONS_REQUEST_READ_CONTACTS); 很多人这么写也完成了手动申请权限了,但是我今天试了下不行,出现问题了,那就是onRequestPermissionsResult回调没有执行,弹出申请权限弹窗并授权后,没法拿到用户的授权结果。 拿不到授权结果的话,用户只能再次点击按钮,此时检测到有权限了,可以直接执行了。 但是这也太傻了吧。 继续在网上寻找解决方案,有的网友的意思是fragment所在的Activity的onRequestPermissionsResult回调才会执行,fragment的不会,尝试发现果然是Activity的回调执行了,那岂不是我需要把这部分授权后的执行逻辑全部从fragment中移到Activity了啊,不爽啊。 结论 继续搜索后发现,原来在fragment场景里用这种写法是不对的。 在fragment中不应该ActivityCompat.requestPermissions的方式来请求权限,fragment本身就有方法来做到这一点,直接用requestPermissions方法即可,该方法相比ActivityCompat.requestPermissions不需要Activity实例了,使用起来更简单了。 具体代码这么写就行了 requestPermissions( arrayOf(Manifest.permission.READ_CONTACTS), MY_PERMISSIONS_REQUEST_READ_CONTACTS ) 我们可以尝试进一步测试下,如果fragment和Activity中都有requestPermissions呢?是只执行其中一个,还是两个都执行?如果两个都执行,它们的执行顺序是怎样的? 实测发现在fragment中用requestPermissions申请权限时,会先执行该fragment的onRequestPermissionsResult回调,然后之前该fragment所在的Activity的onRequestPermissionsResult回调。

java.lang.ClassCastException: androidx.appcompat.app.ToolbarActionBar cannot be cast to androidx.appcompat.widget.Toolbar

最近看《android权威指南》的时候,看到里面提到了自定义toolbar 想把上面的改成自定义的toolbar 其中有几个改动是: 移除了主题默认的工具栏 在manifest里面加入了android:theme="@style/NoActionBarTheme" <activity android:name="com.daozhao.hello.activity.CriminalActivity" android:theme="@style/NoActionBarTheme" android:exported="true" android:label="@string/crime"> </activity> 在strings.xml中加入了NoActionBarTheme <style name="NoActionBarTheme" parent="Theme.AppCompat.Light.NoActionBar"> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style> 加入自己的Toolbar 在fragment的xml文件中加入了androidx.appcompat.widget.Toolbar <?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="match_parent"/> </androidx.appcompat.widget.Toolbar> 在fragment的onAttach的时候加入 val appCompactActivity = requireActivity() as AppCompatActivity toolbar = appCompactActivity.supportActionBar as Toolbar; 但是在运行过程中出现了报错 java.lang.ClassCastException: Read more…

上海市2023年事业单位公开招聘及报名数据统计

上海市2023年事业单位公开招聘公告简述如下; 招聘 一、招聘对象和条件 1.具有中华人民共和国国籍,拥护中华人民共和国宪法,拥护中国共产党领导和社会主义制度,具有良好的政治素质和道德品行。 2.具备招聘单位规定的岗位聘用要求、资格条件、工作能力、身体条件和心理素质。详见附件1《上海市2023年事业单位公开招聘简章》(以下简称《招聘简章》)。 3.外省市社会人员,须持有上海市居住证(在有效期内)一年以上,计算截止时间为2023年12月31日。 二、报名时间和方式 报名时间为2023年2月13日10:00至2月17日16:00。 每人限报考一个岗位。报名期间考生可自行更改报名信息,报名截止后成功报考岗位的报考人员可在规定时限下载打印准考证和参加考试。考试不收取报名考务费。 报名相关的具体细节可以见官网的公告,地址上海市2023年事业单位公开招聘公告 数据分析 累计招聘岗位2727个,招聘人数3438个,报名人数84864人。 年龄段划分 年龄上限 岗位数 30 829 35 1677 40 212 45 9 报名要趁早,30岁~35岁(含)以下可以的还有91.9%,35岁以上就只有7.1%,35岁这哪是一道坎,这分明是一条河。 招聘人数划分 招聘人数 岗位数 269 1 12 1 10 1 8 1 7 1 6 1 5 5 4 11 3 48 2 256 1 2401 招聘人数绝大部分都是一个人,我们看看上面的前三名的招聘大户? Read more…

原来HMS core消息推送限制推送数量了

在过去的一、两个月开始自己用来给自己的手机没有收到之前开发的推送消息用的Hello Daozhao应用程序的消息了,此app主要用来推送爬虫获取到的消息的。 春节期间调试程序的时候,发现自己的服务器显示的发送了推送消息,但是手机端确并没有收到通知,排查发现原来是HMS限制了推送消息的数量,只是刚好在20230105开始正式生效了。 在邮箱里面翻了翻邮件,原来华为在这一年了陆续都在调整跟推送相关的政策。 华为将推送将消息分为2大分类(服务通讯类 + 资讯营销类),22种消息类型。 大类 消息类型 category取值 服务通讯类 即时聊天 IM 音频、视频通话 VOIP 服务通讯类 订阅 SUBSCRIPTION 出行 TRAVEL 健康 HEALTH 工作事项提醒 WORK 帐号动态 ACCOUNT 订单&物流 EXPRESS 财务 FINANCE 设备提醒 DEVICE_REMINDER 系统提示 SYSTEM_REMINDER 邮件 MAIL 资讯营销类 内容推荐 MARKETING 内容推荐 MARKETING 新闻 MARKETING 财经动态 MARKETING 生活资讯 MARKETING 社交动态 MARKETING 调研 Read more…

解决android状态栏消息图标变成白色方块

今天突发奇想在android上调试时无意中发现状态栏消息显示图标居然是白色方块,自己平时用的手机是HarmonyOS 2.0,没有这个问题,但是原生android有问题,看看怎么解决吧。 所谓白色块问题如下: 我使用的这样一张png图片 网上搜了下将怎么解决这个的文章,看来好多人也遇到过这个问题。大家给的解决方式(说是Google官方这么说的)要用只有alpha通道的图片,有的还说要转成android可用的xml来使用。 一个纯alpha通道的图片就把我搞懵了,在网上搜了半天ps相关教程才算弄出来,最后还不是透明色。。。最后还说自己在将它转成xml时,修改xml改成的透明色的,最终还是弄好了,难道这的需要这么复杂。 我期间可以借助了PS + 图片转svg网站 + android studio svg2VectorDrawable插件 才搞定的,太难了吧。 自己做一张透明背景色的图片替换下就好。 重新编译下 可以了,HarmonyOS 2.0自然更不用说,没问题的。 PS:下拉通知栏里面显示红色是因为设置了背景色 .setColor(Color.RED),中国红真够醒目的,赞。

防止通过浏览器开发者工具复制内容的简单方法

前一天去某个模板网站闲逛,看到了比较好的模板,忍不住想看看人家是怎么实现的,突然被莫名的断点吸引了,原来网站是为了防止我“偷”它的内容啊。 出于习惯,我当然要看看这个断点是怎么回事啦,原来它室利用debugger和一个定时器来让页面在打开控制台后,一直处在被断点卡出的状态,使得通过选择页面元素等操作被中断。 该网站模板很精美,是以此盈利的网站,东西明码标价,避免在预览的时候被人白嫖,用点手段也无可厚非。 写个demo看看具体实现吧,其实方法很简单。 setInterval(() => { console.log('卡住了就关闭开发者工具吧') debugger; }, 0) 效果如下 现在很多网站自己没什么优质的内容,还不让大家复制,甚至还需要登录或者关注后才能查看复制内容,典型的就是CSDN,现在已是业内毒瘤了。 可不止我一个人这么认为哦 没错,我也不忘吐槽下CSDN。

2022年主要技改总结

2022年已经过去,一年里面忙忙碌碌的,自己年底想总结出来一个PPT,写写自己主要干了哪些值得一提的技术贡献时,又感觉自己没干出什么大事,所以说啊,还是得面向PPT干活,面向简历打工。 自己下半年其实做了一个邮件的页面联动(之前写过邮件项目左侧tab切换,右侧主体内容联动的技术实现思考过程),但是这个事情表述上有点麻烦(功力不够),为了避免造成麻烦,这个就不提了。 自定义分词起始规则实现关键词全词高亮项目实战(全语种通吃) 用babel插件将现有项目硬编码中文自动国际化 还有一个自动保存草稿的(邮件草稿自动保存器hooks代-码实现),就作为未来规划吧,实际上已经开发完了,只是在灰度而已。嘿嘿。

冷门知识在富文本编辑器中的应用

<!DOCTYPE html>能有什么作用,之前只是听说声明为HTML5文档,必须写在在html文档的第一行,它会让浏览器强制使用w3c标准来解析和渲染页面。 理论知识 其实在浏览器中存在两种文档解析模式: 怪异模式:BackCompat,使用浏览器自己的模式解析标签。 标准模式:CSS1Compat,使用W3C标签来解析标签。 可以通过document.compatMode返回结果得知当前是何种模式,目前使用BackCompat的场景并不少。 实践过程 了解这个有什么用呢?我也是最近在尝试调研163邮箱默认样式技术细节的时候,发现了一点它的具体作用。 模式不同,浏览器对dom渲染高度的计算有所不同,目前已知的是父元素设置的font-size是否影响子元素height上。 怪异模式 有点抽象,可以举个具体的例子。 富文本编辑器的编辑区域多半是在一个iframe里面,我们直接看这个iframe里面的html结构 <html> <head></head> <body class="nui-scroll" spellcheck="false" autocorrect="false" contenteditable="true" style="cursor: auto; color: #174e85;font-size: 48px;font-family: simsun, STSongti-SC-Regular;line-height: 1.7;"> <div style="margin: 0;">宋体48px</div> <div style="margin: 0;">宋体48px<span style="font-size: 12px;">12px</span></div> <div style="margin: 0;"><span style="font-size: 12px;">12px</span></div> <div style="margin: 0;"><span style="font-size: 12px;">12px</span></div> <div style="margin: 0;"><span style="font-size: Read more…

antd 级联选择器Cascader(或TreeSelect树选择器 )如何仅根据最后一级value回显完整中文路径

Cascader(或TreeSelect树选择器 )往往会在项目中用在分类管理这一需求,可以很好的展示分类的层级结构,有时可能因为分类会存在改变层级(如由四级分类变成了二级分类)的情况,后端接口会要求在存储分类数据的时候,仅传递最后一级的信息。 例子 举个antd官网的例子: import { Cascader } from 'antd'; const options = [ { value: 'zhejiang', label: 'Zhejiang', children: [ { value: 'hangzhou', label: 'Hangzhou', children: [ { value: 'xihu', label: 'West Lake', }, ], }, ], }, { value: 'jiangsu', label: 'Jiangsu', disabled: true, children: [ { value: Read more…

前端如何用一行代码将网站置灰

在悲伤的日子里,很多大型网站会把网站整体置灰,或者把首页置灰,怎么做到的呢,肯定不是一个一个来设置,只用在外层容器上加个css即可。 html { filter: grayscale(); } 就这么简单。 当然为了更好的兼容性,我们可能需要多写一点。 html { -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); -o-filter: grayscale(100%); filter: grayscale(100%); -webkit-filter: gray; filter: gray; -webkit-filter: progid:dximagetransform.microsoft.basicimage(grayscale=1); filter: progid:dximagetransform.microsoft.basicimage(grayscale=1); } 本站活泼鲜艳的颜色也置灰了。 filter还有其它用法 比如blur()模糊,brightness()亮度,contrast ()对比度,opacity ()不透明,可以自行试下效果。 filter兼容性