首页 文章 精选 留言 我的

精选列表

搜索[动态工作流],共10006篇文章
优秀的个人博客,低调大师

Android 7.0动态权限大总结

应公司项目需求,做了下Android 7.0适配。对于我们程序员,适配7.0主要就是对手机本地文件的Uri做转换处理。注意红色字体,意思也就是说对于http开头的等等,非手机存储中的文件就不用管了。Uri.parse(“package”) 这样的也不用管!!!!! 7.0的适配,就是对手机存储中的私有文件路径的保护,当系统发现你通过intent带走了一个uri,地址是本地的文件,就会限制的。其他的原理普及请搜索其他文章吧,此处略。 下面贴一下使用步骤和我的工具类。 一、需要修改当前module的AndroidManifest.xml文件,添加provider标签,映射路径。 <android:supportsRtl="true"> <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.myFileProvider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/path_file"/> 文中红色部分是固定写法,官网就是这么说的,别乱试了。android:resource标签的值是main/res/xml/path_file.xml文件,即在 res下新建xml文件夹,再新建一个xml文件。 二、在res/xml下新建一个path_file.xml文件,文件名随便去,但是与上步骤一致即可。 <?xmlversion="1.0"encoding="utf-8"?> <resources> <paths> <!-- <files-path/>代表的根目录:Context.getFilesDir() <cache-path/>代表的根目录:getCacheDir() <external-path/>代表的根目录:Environment.getExternalStorageDirectory() <external-files-path/>代表的根目录:Context.getExternalFilesDir(String)Context.getExternalFilesDir(null). <external-cache-path/>代表的根目录:Context.getExternalCacheDir(). <root-path/>代表设备的根目录newFile("/"); --> <!--path=""代表根目录,也可以指定特定目录,name="camera_picture"是虚拟目录camera_picture--> <root-pathname="root"path=""/> <files-pathname="files"path=""/> <cache-pathname="cache"path=""/> <external-pathname="external"path=""/> <external-files-pathname="external_files"path=""/> <external-cache-pathname="external_cache"path=""/> </paths> </resources> 里面共有6个path标签,含义都写了,根据你的需要些对应的标签即可。比喻<external-path/>标签,里面的path=”"时,这个标签映射的就是外挂sd卡根目录了,name属性没什么用,来迷惑第三方应用的虚拟目录,来掩盖文件的真实路径。 三、工具类来了。 FileUriPermissionCompat.Java /** *@Author:duke *@DateTime:2017-06-0614:43 *@Description:android7.0uri权限适配, *(通过intent暴漏uri或file给第三方app时的)私有目录被禁止访问 *已对localpath和netpath做了适配 */ publicclassFileUriPermissionCompat{ privatestaticfinalStringTAG=FileUriPermissionCompat.class.getSimpleName(); //TODO:此处需要更改为对应值 //此处需要改成AndroidManifest.xml中申请的对应的provider的authorities值 privatestaticfinalStringAUTHORITIES="com.duke.personalkeeper.myFileProvider"; /** *是否需要适配7.0权限 * *@return */ publicstaticbooleanisNeedAdapt(){ //24以上版本 returnBuild.VERSION.SDK_INT>=Build.VERSION_CODES.N; } publicstaticUriadaptUriAndGrantPermission(Contextcontext,Intentintent,Filefile){ Uriuri=adaptUri(context,file); if(uri==null){ returnnull; } grantUriPermission(context,intent,uri); returnuri; } publicstaticUriadaptUri(Contextcontext,Filefile){ if(context==null||file==null){ returnnull; } //网络路径的特殊处理,不需要7.0适配,但必须用parse()方法 if(file.getPath().startsWith("http")){ returnUri.parse(file.getPath()); } Uriuri=null; try{ if(isNeedAdapt()){ //需要7.0特殊适配 //通过系统提供的FileProvider类创建一个content类型的Uri对象 uri=FileProvider.getUriForFile(context,AUTHORITIES,file); }else{ //不需要适配 uri=Uri.fromFile(file); } }catch(Exceptione){ Log.e(TAG,"authoritiesvalueerror,socan'tconverturi!"); e.printStackTrace(); } returnuri; } /** *对第三方应用赋予对uri读写的权限 * *@paramcontext *@paramintent *@paramsaveUri适配后的uri */ publicstaticvoidgrantUriPermission(Contextcontext,Intentintent,UrisaveUri){ if(!isNeedAdapt()){ return; } if(context==null||intent==null||saveUri==null){ return; } //网络路径的特殊处理,不需要权限 if(saveUri.getScheme()!=null&&saveUri.getScheme().startsWith("http")){ //不需要授权 return; } //1、授权(系统相册、相机、裁剪时需要)--这种写法待分析 ListresInfoList=context.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); for(ResolveInforesolveInfo:resInfoList){ StringpackageName=resolveInfo.activityInfo.packageName; if(TextUtils.isEmpty(packageName)){ continue; } context.grantUriPermission(packageName,saveUri,Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } //2、授权(安装apk时需要) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } publicstaticvoidrevokeUriPermission(Contextcontext,Intentintent,UrisaveUri){ if(!isNeedAdapt()){ return; } if(context==null||intent==null||saveUri==null){ return; } //网络路径的特殊处理,不需要权限 if(saveUri.getScheme()!=null&&saveUri.getScheme().startsWith("http")){ //不需要授权 return; } try{ context.revokeUriPermission(saveUri,Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); }catch(Exceptione){ e.printStackTrace(); } } } 核心代码: uri=FileProvider.getUriForFile(context,AUTHORITIES,file); file就是你想要暴露给其他应用的文件地址,比喻你要拍照,把结果保存到file文件中。 AUTHORITIES就是上面第一步中,android:authorities=”${applicationId}.myFileProvider”的实际值, ${applicationId}取得是app/build.gradle中defaultConfig标签的applicationid值。通过系统提供的FileProvider类的静态方法转换file地址为一个以content://开头的特殊的uri。如果不转换的话,直接用Uri.fromFile(file),你得到的是一个file:///xxxxx这样的uri。就这差别。 转换了uri之后,还需要授权: /** *对第三方应用赋予对uri读写的权限 * *@paramcontext *@paramintent *@paramsaveUri适配后的uri */ publicstaticvoidgrantUriPermission(Contextcontext,Intentintent,UrisaveUri){ if(!isNeedAdapt()){ return; } if(context==null||intent==null||saveUri==null){ return; } //网络路径的特殊处理,不需要权限 if(saveUri.getScheme()!=null&&saveUri.getScheme().startsWith("http")){ //不需要授权 return; } //1、授权(系统相册、相机、裁剪时需要)--这种写法待分析 List<ResolveInfo>resInfoList=context.getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY); for(ResolveInforesolveInfo:resInfoList){ StringpackageName=resolveInfo.activityInfo.packageName; if(TextUtils.isEmpty(packageName)){ continue; } context.grantUriPermission(packageName,saveUri,Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } //2、授权(安装apk时需要) intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } 里面有两部分授权方式,经过多轮测试,发现需要同时使用比较好。 第一种方式,for循环,是因为有时候你并不确定需要分享的应用的包名是哪一个,所以找到所有有可能的第三方应用,全部授权了。 后来测试发现,安装apk的时候,只有上面的授权是不行的,还得加上intent.addFlag的方式再次授权才行。 最后,需要注意的是: 1、注意7.0的版本判断。 2、切记,7.0的权限有可能需要对sd卡读写,需要6.0的读写sd卡权限。当你测试7.0权限不成功时,考虑下6.0的权限是否到位了。 其他的没的说了。就这些。 本文作者:佚名 来源:51CTO

优秀的个人博客,低调大师

极简工作流「GitHub 热点速览」

原以为 LLM 很难,但其实可以很简单,比如 Flowise 拖拽拖拽就能出来一个 LLM 流程,非常简单你的 LLM 就可以 run 起来了。同样的 web-check 也能极快速地帮你解决 Web 安全那些事,什么 DNS、Cookie 的安全问题不在话下,非常简单,一个仪表盘就看得一清二楚。 更不要提 Rust 做的极简 ML 框架、快速构建 React 页面的 themes,还有数据库和服务器二合一的 SpacetimeDB。 以下内容摘录自微博@HelloGitHub 的 GitHub Trending 及 Hacker News 热帖(简称 HN 热帖),选项标准:新发布 | 实用 | 有趣,根据项目 release 时间分类,发布时间不超过 14 day 的项目会标注 New,无该标志则说明项目 release 超过半月。由于本文篇幅有限,还有部分项目未能在本文展示,望周知 🌝 本文目录 1. 本周特推 1.1 Web 安全:web-check 1.2 数据库、服务器二合一:SpacetimeDB 2. GitHub Trending 周榜 2.1 加密平台:infisical 2.2 极简机器学习框架:candle 2.3 React 组件:themes 2.4 AI 模拟人类行为:generative_agents 2.5 极简 LLM:Flowise 3. HelloGitHub 热评 3.1 模拟数据解密效果:no-more-secrets 3.2 从 0 到 1 数据库内核实战教程:miniob 4. 往期回顾 1. 本周特推 1.1 Web 安全:web-check 主语言:TypeScript New web-check 让你深入了解一个特定网站的内部运作,发现潜在攻击向量,分析服务器架构,查看安全配置,并了解网站使用的技术。 目前,web-check 仪表板显示的信息有:IP 信息、SSL 链、DNS 记录、Cookies、头部信息、域名信息、搜索爬行规则、页面地图、服务器位置、重定向日志、开放端口、路由跟踪器(traceroute)、DNS 安全扩展功能,网站性能指标,追踪器(trackers),关联主机名和 carbon 足迹。 GitHub 地址→https://github.com/Lissy93/web-check 1.2 数据库、服务器二合一:SpacetimeDB 主语言:Rust New 一个数据库和服务器二合一的项目,作为一个关系型数据库系统,它支持你通过 module 模式将应用程序的逻辑直接传到数据库中。简单来说,它让你用 Rust 编程整个应用程序,并将其部署为单个二进制文件,不需要微服务,不需要容器,也不用 K8s 和 Docker,就能实现数据上线。 GitHub 地址→https://github.com/clockworklabs/SpacetimeDB 2. GitHub Trending 周榜 2.1 加密平台:infisical 本周 star 增长数 1,050+,主语言:TypeScript Infisical 是一个开源的端到端加密平台,可以使用它来集中管理 API 密钥、数据库凭据和配置等秘密信息:可以在团队/基础设施之间同步秘密,并防止秘密泄露。 GitHub 地址→https://github.com/Infisical/infisical 2.2 极简机器学习框架:candle 本周 star 增长数:2,000+,主语言:Rust New Candle 是一个以性能(包括 GPU 支持)和易用性为重点的 Rust 极简机器学习框架。 whisper 在线尝试:https://huggingface.co/spaces/lmz/candle-whisper llama2 在线尝试:https://huggingface.co/spaces/lmz/candle-llama2 let a = Tensor::randn(0f32, 1., (2, 3), &amp;Device::Cpu)?; let b = Tensor::randn(0f32, 1., (3, 4), &amp;Device::Cpu)?; let c = a.matmul(&amp;b)?; println!("{c}"); GitHub 地址→https://github.com/huggingface/candle 2.3 React 组件:themes 本周 star 增长数:650+,主语言:TypeScript New 一个针对快速开发、易于维护和可访问性优化的开源组件库,可用它来快速构建 / 修改你的用户界面。 GitHub 地址→https://github.com/radix-ui/themes 2.4 AI 模拟人类行为:generative_agents 本周 star 增长数:7,200+ 斯坦福大学最近的一个实验,用人工智能来模拟一个小镇,观察 AI 是否能模拟人类行为。这个仓库是论文的附属资料,你也可以来建设模拟你自己的小镇。 GitHub 地址→https://github.com/joonspk-research/generative_agents 2.5 极简 LLM:Flowise 本周 star 增长数:1,000+,主语言:TypeScript 一个用来快速构建你 LLM 项目的工具,只需要拖拽就可以生成你的 LLM 流程。 GitHub 地址→https://github.com/FlowiseAI/Flowise 3. HelloGitHub 热评 在这个章节,我们将会分享下本周 HelloGitHub 网站上的热评项目,HG 开源项目评价体系刚上线不久,期待你的评价。 3.1 模拟数据解密效果:no-more-secrets 主语言:C 这是一个可以在终端中模拟 1992 年《通天神偷》电影中的数据解密效果的命令行工具。它可以将 ASCII 或 UTF-8 文本,用好莱坞式的解密效果展示。 HG 评价地址→https://hellogithub.com/repository/c9a0ea35566a415e8f46e0f5b4424675 3.2 从 0 到 1 数据库内核实战教程:miniob 主语言:C++ 该项目是 OceanBase 团队基于华中科技大学数据库课程原型,联合多所高校重新开发的、从零上手数据库的学习项目。它结构简单、代码简洁,不仅有文字讲解和视频教程,还有由浅入深的题目。通过理论+实战的方式,帮忙初学者迅速掌握内核模块功能和协同关系,提高工程编码能力,有助于在面试和工作中脱颖而出。 HG 评价地址→https://hellogithub.com/repository/62efc8a5bbb64a9fbb1ebb7703446f36 4. 往期回顾 往期回顾: 数据处理的那些事「GitHub 热点速览」 图解算法,原理逐步揭开「GitHub 热点速览」 以上为 2023 年第 32 个工作周的 GitHub Trending 🎉如果你 Pick 其他好玩、实用的 GitHub 项目,来 HelloGitHub 和大家一起分享下哟 🌝

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册