首页 文章 精选 留言 我的

精选列表

搜索[MoE动态路由],共10000篇文章
优秀的个人博客,低调大师

Flink Weekly | 每周社区动态更新

作者:唐云(茶干) 大家好,2020 年转眼就来了,先恭喜大家新年快乐,Flink 社区也会在新的一年中继续陪伴大家,一起将 Flink 做大做好。 本文为 Flink Weekly 的第三期,由 Tang Yun 整理,主要内容包括:Flink 1.10.0 的发布进展,将 blink planner 设置为 SQL client 默认 planner 的讨论,以及如何支持 SQL client gateway 的 FLIP。 Flink 开发进展 [Release] Yu 分享了目前 Flink-1.10 发布的喜人进展,release-1.10 分支刚被拉出来时有 46 个 blocker,11 个 critical 级别的 issue,目前已经下降到只有 12 个 blocker 级别的 issue,一个 RC 版本有望于近期发布,可以访问下面的链接一睹为快: http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/ANNOUNCE-Progress-of-Apache-Flink-1-10-3-td36359.html [Build] 在社区邮件达成一致后,目前 Flink 已经移除了厂商提供的仓库支持: http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Drop-vendor-specific-repositories-from-pom-xml-td36113.html https://issues.apache.org/jira/browse/FLINK-15459 [SQL] Forward Xu 发起了 FLIP-90(在 Flink SQL 中支持 SQL 2016-2017 JSON 函数)的投票,考虑到讨论时没有收到负面意见,该投票有望较快通过。 http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/VOTE-FLIP-90-Support-SQL-2016-2017-JSON-functions-in-Flink-SQL-td36341.html http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Support-JSON-functions-in-Flink-SQL-td32674.html [SQL] Jark 发起了在 Table API&SQL 中将"Time-windowed Join"重命名为"Interval Join" 的投票: http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/VOTE-Rename-terminology-quot-Time-windowed-Join-quot-to-quot-Interval-Join-quot-in-Table-API-amp-SQL-td36370.html [SQL] Jark 发起了将 Blink planner 在 release 1.10 中设置为 SQL Client 默认 planner 的讨论。目前 Table API 仍然使用 Flink planner,但是也规划在 release 1.11 中将 Blink planner 设置为默认 planner。理论上来说 Blink planner 是 Flink planner 的超集,当然不排除一些边角功能没有覆盖到,如果你有任何相关发现,欢迎在下面的邮件中回复: http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-Set-default-planner-for-SQL-Client-to-Blink-planner-in-1-10-release-td36379.html [SQL] Godfreyhe 发起了支持 SQL client gateway(FLIP-91)的讨论。FLIP-91 的目标是在 FLIP-24 的基础上使得 SQL Client 支持 REST/JDBC 接口,提高 Flink SQL 的易用性。 http://apache-flink-mailing-list-archive.1008284.n3.nabble.com/DISCUSS-FLIP-91-Support-SQL-Client-Gateway-td36349.html 需要注意的一些缺陷 [FLINK-15477] [1.9.1] 有用户反馈无法创建 BatchTableEnvironment。 https://issues.apache.org/jira/browse/FLINK-15477 [FLINK-15467] [1.9.1] task cancel 阶段没有等待 source 线程发送完全数据。 https://issues.apache.org/jira/browse/FLINK-15467 [FLINK-15466] 1.8.3 FlinkAggregateExpandDistinctAggregatesRule 会在执行带有过滤的 distinct aggs 时创建错误的 SQL plan。 https://issues.apache.org/jira/browse/FLINK-15466 [FLINK-15463] [1.9.1] 使用 table SQL API 连接 phoenix 时,会遇到 ClassNotFoundException 异常。 https://issues.apache.org/jira/browse/FLINK-15463 中文邮件问题答疑汇总 IDEA 默认选择 java 11 profile,导致 IDEA 在 JDK8 下无法编译 Flink。已经获得了相关解决方法: http://apache-flink.147419.n8.nabble.com/Error-java-add-exports-java-base-sun-net-util-ALL-UNNAMED-td943.html Flink 内存配置相关的问题解答: http://apache-flink.147419.n8.nabble.com/flink-td1358.html 如何获取一条数据记录的处理时间: http://apache-flink.147419.n8.nabble.com/-td1380.html StreamTableEnvironment.registerDatastream() 开放用户自定义的 schemaDescriptionh 和 DeserializationSchema: http://apache-flink.147419.n8.nabble.com/StreamTableEnvironment-registerDatastream-schemaDescriptionh-DeserializationSchema-td1347.html 2 分钟快速订阅 Flink 中文邮件列表 Apache Flink 中文邮件列表订阅流程: 发送任意邮件到 user-zh-subscribe@flink.apache.org 收到官方确认邮件 回复该邮件 confirm 即可订阅 订阅成功后将收到 Flink 官方的中文邮件列表的消息,您可以向 user-zh@flink.apache.org 发邮件提问也可以帮助别人解答问题,动动手测试一下! Tips: Flink Weekly 周报计划每周更新一期,内容涵盖邮件列表中用户问题的解答、社区开发和提议的进展、社区新闻以及其他活动、博客文章等,欢迎持续关注~ 作者介绍: 唐云(茶干),南京大学硕士,2017 年加入阿里巴巴实时计算事业部,专注 Flink 核心引擎开发,入职以来长期从事 Flink state & Checkpoint 相关研发,目前也积极参与 Flink on K8s 相关软件化输出开发和社区开发推广工作。

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

Linux 磁盘动态扩容 PVM(转载)

CentOS7.x系统根目录分区扩容 说明:系统版本为 Linux version 3.10.0-327.el7.x86_64 step1. 查看现有磁盘信息,可以看出根分区有45G [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos_mb--centos7-root 45G 9.8G 35G 23% / devtmpfs 5.9G 0 5.9G 0% /dev tmpfs 5.9G 84K 5.9G 1% /dev/shm tmpfs 5.9G 8.9M 5.9G 1% /run tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup /dev/sda1 497M 142M 356M 29% /boot tmpfs 1.2G 16K 1.2G 1% /run/user/42 tmpfs 1.2G 0 1.2G 0% /run/user/0</pre> [ 复制代码 ](javascript:void(0); "复制代码") step2. 查看新增加的磁盘信息 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# fdisk -l Disk /dev/sda: 53.7 GB, 53687091200 bytes, 104857600 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x000e0945 Device Boot Start End Blocks Id System /dev/sda1 * 2048 1026047 512000 83 Linux /dev/sda2 1026048 104857599 51915776 8e Linux LVM Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos_mb--centos7-root: 47.7 GB, 47747956736 bytes, 93257728 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/mapper/centos_mb--centos7-swap: 5368 MB, 5368709120 bytes, 10485760 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes</pre> [ 复制代码 ](javascript:void(0); "复制代码") step3. 根据以上信息,对新增加的磁盘进行分区 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table Building a new DOS disklabel with disk identifier 0x232defba. Command (m for help): p Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x232defba Device Boot Start End Blocks Id System Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-209715199, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): Using default value 209715199 Partition 1 of type Linux and of size 100 GiB is set Command (m for help): t Selected partition 1 Hex code (type L to list all codes): L 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden C: c6 DRDOS/sec (FAT- 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi eb BeOS fs e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD ee GPT f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ef EFI (FAT-12/16/ 10 OPUS 55 EZ-Drive a7 NeXTSTEP f0 Linux/PA-RISC b 11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f1 SpeedStor 12 Compaq diagnost 5c Priam Edisk a9 NetBSD f4 SpeedStor 14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary 16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE 18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep 1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT 1e Hidden W95 FAT1 80 Old Minix Hex code (type L to list all codes): 8e Changed type of partition 'Linux' to 'Linux LVM' Command (m for help): p Disk /dev/sdb: 107.4 GB, 107374182400 bytes, 209715200 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk label type: dos Disk identifier: 0x232defba Device Boot Start End Blocks Id System /dev/sdb1 2048 209715199 104856576 8e Linux LVM Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.</pre> [ 复制代码 ](javascript:void(0); "复制代码") step4. 创建物理卷 <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# pvcreate /dev/sdb1 Physical volume "/dev/sdb1" successfully created</pre> step5. 查看物理卷信息 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# pvdisplay --- Physical volume --- PV Name /dev/sda2 VG Name centos_mb-centos7 PV Size 49.51 GiB / not usable 3.00 MiB Allocatable yes PE Size 4.00 MiB Total PE 12674 Free PE 10 Allocated PE 12664 PV UUID 8WbgjB-T1Lf-kqUD-qPFw-UwJu-B9Lc-GAUTUB "/dev/sdb1" is a new physical volume of "100.00 GiB" --- NEW Physical volume --- PV Name /dev/sdb1 VG Name PV Size 100.00 GiB Allocatable NO PE Size 0 Total PE 0 Free PE 0 Allocated PE 0 PV UUID HOknRs-TnMy-wtfX-sGqD-5RK9-dk9q-ze13fj</pre> [ 复制代码 ](javascript:void(0); "复制代码") [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# vgdisplay --- Volume group --- VG Name centos_mb-centos7 System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 1 Act PV 1 VG Size 49.51 GiB PE Size 4.00 MiB Total PE 12674 Alloc PE / Size 12664 / 49.47 GiB Free PE / Size 10 / 40.00 MiB VG UUID aN2D2P-Rk1y-wGFz-5l2I-5CcD-7s88-Z8czc7</pre> [ 复制代码 ](javascript:void(0); "复制代码") step6. 将新增加的分区/dev/sdb1加入到根目录分区centos_mb-centos7中 <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# vgextend centos_mb-centos7 /dev/sdb1 Volume group "centos_mb-centos7" successfully extended</pre> step7. 重新查看卷组信息 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# vgdisplay --- Volume group --- VG Name centos_mb-centos7 System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 4 VG Access read/write VG Status resizable MAX LV 0 Cur LV 2 Open LV 2 Max PV 0 Cur PV 2 Act PV 2 VG Size 149.50 GiB PE Size 4.00 MiB Total PE 38273 Alloc PE / Size 12664 / 49.47 GiB Free PE / Size 25609 / 100.04 GiB VG UUID aN2D2P-Rk1y-wGFz-5l2I-5CcD-7s88-Z8czc7</pre> [ 复制代码 ](javascript:void(0); "复制代码") step9. 进行卷扩容 <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# lvextend -l +100%FREE /dev/mapper/centos_mb--centos7-root Size of logical volume centos_mb-centos7/root changed from 44.47 GiB (11384 extents) to 144.50 GiB (36993 extents). Logical volume root successfully resized.</pre> step10. 调整卷分区大小 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# xfs_growfs /dev/mapper/centos_mb--centos7-root meta-data=/dev/mapper/centos_mb--centos7-root isize=256 agcount=4, agsize=2914304 blks = sectsz=512 attr=2, projid32bit=1 = crc=0 finobt=0 data = bsize=4096 blocks=11657216, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=0 log =internal bsize=4096 blocks=5692, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 11657216 to 37880832</pre> [ 复制代码 ](javascript:void(0); "复制代码") 最后,查看磁盘信息可以看出根目录分区大小已成功扩容 [ 复制代码 ](javascript:void(0); "复制代码") <pre style="margin: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;">[root@DEV-CMDB-DB02 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos_mb--centos7-root 145G 9.8G 135G 7% / devtmpfs 5.9G 0 5.9G 0% /dev tmpfs 5.9G 84K 5.9G 1% /dev/shm tmpfs 5.9G 8.9M 5.9G 1% /run tmpfs 5.9G 0 5.9G 0% /sys/fs/cgroup /dev/sda1 497M 142M 356M 29% /boot tmpfs 1.2G 16K 1.2G 1% /run/user/42 tmpfs 1.2G 0 1.2G 0% /run/user/0</pre> [ 复制代码 ](javascript:void(0); "复制代码")

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

Android 动态加载 (三) PAK 详解

pak文件经常出现于游戏的安装目录中,其实pak文件是一种特殊的游戏压缩文件,用于压缩声音、图片等资料。由于pak文件专门针对游戏设计文件结构,pak文件就是将多个文件(图片、音乐、文本)打包为一个单独文件,在pak文件中保存着多个文件的数据。 pak是什么文件? 现 在大部分游戏的客户端都采用pak压缩格式,以便于游戏的开发。由于是一种压缩格式,pak文件可以用一些专业压缩软件(如WinRAR、 WinZip)打开,但由于其特殊性与一般的压缩文件格式打开方式有所不同。pak文件一般是游戏的文件,里面存了很多游戏所需的重要文件,并且是加密了 的,现在虽说有能打开pak文件的软件,但也仅限于未加密的。不过有一些专门的浏览工具可以提取其中的声音进行修改后保存为其他格式音乐。 pak文件如何打开? 那么pak文件怎么打开呢?下面小编就收集了一些支持pak文件的软件供大家使用。 特点: 1.声音,地图,3D模型,材质贴图等文件是按着保留 目录路径结构的方式压缩入PAK文件的。 2.压缩的时候可以令压缩也可以按照一定的 压缩率压缩。 使用pak这种文件格式对于游戏的开发者和玩家都有著无以伦比的方便性和可塑性(或者说自定义性)。具体如何实现的,等一下我将举例说明。使用pak包这种形式有几点好处: 1.对于程开发人员来说资源调用方便,易于管理; 2.由于结构特殊,对初学者有屏蔽作用避免被乱改,对高手却很容易修改,比较方便; 3.所有模式都是利用这个特点做的; 4.pak包被游戏的引擎视为一个目录,能利用外置pak文件的形式进行升级而无需删除原有文件。利於增加效果包,新地图,改进界面,增加model等扩展内容; 5.修改还原便利,文件之间互不影响。 如果想要打开pak结尾的文件,使用PAk浏览器 RPGViewer 3.0 下载了以后一定要看说明书(readme.txt) 可以直接查看PAK格式的内容 PAK解压: 工具里面有“解压包”的按钮,可以解压PAK 本文转自 一点点征服 博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/5253787.html ,如需转载请自行联系原作者

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

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

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册