首页 文章 精选 留言 我的

精选列表

搜索[向后兼容性],共9022篇文章
优秀的个人博客,低调大师

记录一次解决安装 Apk 兼容性问题

问题描述 现象 代码执行安装Apk,出现系统弹框解析错误,解析包时出现错误 场景 在华为P20 Android 8.0 手机上,下载Apk并使用通知栏进度条显示,开启应用锁屏通知权限,下载过程在锁屏情况下进行,下载完成后自动执行安装Apk,在解锁后出现系统弹框,解析包出现错误。 解决之前安装Apk的方法 首先在AndroidManifest中声明fileProvider <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_path" /> </provider> provider属性说明 属性 说明 name android V4 包中的类FileProvider authorities 你的文件的Uri的域名一般以包名.fileprovider的格式,防止重名 exported 设置不允许导出,我们的FileProvider应该是私有的 grantUriPermissions 允许获取文件的临时访问权限 resourse 设置FileProvider访问的文件路径 res包下创建file_path.xml <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_path" path="test" /> <cache-path name="internal_path" path="test" /> 这里可以创建很多个paths,但是每个paths的name不能一样 </paths> path 说明 <files-path name="*name*" path="*path*" /> 对应的是:Context.getFileDir()的路径地址 对应路径:Context.getFileDir()+"/${path}/" 得到路径:content://${applicationId}/&{name}/ <cache-path name="*name*" path="*path*" /> 对应路径:Context.getCacheFir()+"/${path}/" 得到路径:content://${applicationId}/&{name}/ <external-path name="*name*" path="*path*" /> 对应路径:Environment.getExternalStorageDirectory()+"/${path}/" 得到路径:content://${applicationId}/&{name}/ <external-files-path name="*name*" path="*path*" /> 对应路径:Context.getExternalStorageDirectory()+"/${path}/" 得到路径:content://${applicationId}/&{name}/ <external-cache-path name="*name*" path="*path*" /> 对应路径: Context.getExternalCacheDir()+"/${path}/" 得到路径:content://${applicationId}/&{name}/ 举个例子说明: path做如下声明 <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="my_images" path="images/"/> </paths> File imagePath = new File(Context.getFilesDir(), "images"); File newFile = new File(imagePath, "default_image.jpg"); Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile); contentUri值为:content://com.mydomain.fileprovider/my_images/default_image.jpg 安装apk的方法(7.0版本兼容问题) public static void installApk(Context context,File apkFile){ try { Intent intent = new Intent(Intent.ACTION_VIEW); Uri apkUri = null; //判断版本是否是 7.0 及 7.0 以上 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile); //添加对目标应用临时授权该Uri所代表的文件 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } else { apkUri = Uri.fromFile(apkFile); } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); context.startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } Android 8.0系统需要声明权限 <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGE" /> OK,以上就是大家普遍解决7.0,以及8.0版本兼容问题的方法。 但是,在上文描述的场景中依然报出了错误: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{cc3ad2316425: com.android.packageinstaller/u0a21} (pid=16425, uid=10021) that is not exported from uid 10340 懵逼.jpg 问题定位 经过短暂的懵逼后,开始通过各种方式,探索问题的原因。 根据系统log分析,猜测在锁屏时,用于安装Apk的service处于休眠或者不可用的状态,导致通过intent.addflags方式赋予的临时权限失效了。于是,再次仔细看了官方文档后,发现还有一个方法,可以生成权限且在主动调用方法或者手机重启后才会失效。 改进后的代码 public static void installApk(Context context,File apkFile){ try { Intent intent = new Intent(Intent.ACTION_VIEW); Uri apkUri = null; //判断版本是否是 7.0 及 7.0 以上 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { apkUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile); //添加对目标应用临时授权该Uri所代表的文件 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); } else { apkUri = Uri.fromFile(apkFile); } intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); //查询所有符合 intent 跳转目标应用类型的应用,注意此方法必须放置setDataAndType的方法之后 List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); //然后全部授权 for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); } context.startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } 再次尝试,此问题再没有出现。 原文发布时间为:2018-11-9 本文作者:bear~ 本文来自云栖社区合作伙伴“安卓巴士Android开发者门户”,了解相关信息可以关注“安卓巴士Android开发者门户”。

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

基于Knox登录Yarn UI查看SparkStreaming作业兼容性问题说明

问题背景 1.登录EMR集群节点,运行SparkStreaming示例,如下所示(不同版本EMR集群spark-examples_xxx.jar的路径略有差异): [root@emr-header-1 ~]# spark-submit --class org.apache.spark.examples.streaming.NetworkWordCount --master yarn --deploy-mode cluster /opt/apps/ecm/service/spark/2.3.2-1.0.2/package/spark-2.3.2-1.0.2-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.3.2.jar 192.168.0.211 9999 参数说明:192.168.0.211: 监听流数据源地址9999: 监听流数据源端口 2.提交作业后,通过EMR集群提供的Yarn UI来查看运行在yarn上面作业。 3.点击“ApplicationMaster”,跳转spark界面查看作业详情,切换到“Streaming”可以看到以下界面: 4.点击“Completed Batches”里面的某个完成时间点的Batch,跳转页面会报404错误: 如何解决? 这个问题目前是Knox兼容的一个缺陷,当前的建议是通过端口转发(俗称“打洞”)来访问Yarn UI查看作业,具体步骤如下(本文以Mac客户端为例测试): 1.本机终端输入:ssh-keygen,生成一个公钥: test:~ root$ cd ~/.ssh/ test:.ssh root$ ls id_rsa id_rsa.pub known_hosts test:.ssh root$ cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAA....此处省略很多个字符..-6c96cfde9ab7.local 2.登录到EMR Master 节点,将本机的 id_rsa.pub 内容写入到远程 Master 节点的 ~/.ssh/authorized_keys中: vim ~/.ssh/authorized_keys 3.本机测试免密登录到EMR Master 节点: local:.ssh root$ ssh root@xx.xx.xx.xx Last login: Thu Aug 1 20:24:25 2019 Welcome to Alibaba Cloud Elastic Compute Service ! [root@emr-header-1 ~]# 4.在本机执行以下命令进行端口转发: /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="socks5://localhost:8157" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost" --user-data-dir=/tmp 5.启动 Chrome(在本机新开 terminal 执行)。 /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server="socks5://localhost:8157" --host-resolver-rules="MAP * 0.0.0.0 , EXCLUDE localhost" --user-data-dir=/tmp 6.EMR控制台进入集群的安全组,放行8088、20888两个端口(可以通过ip.taobao.com获取客户端公网出口IP): 7.在Chrome中通过xx.xx.xx.xx:8088访问 8.点击“ApplicationMaster”,跳转spark界面查看作业详情无法访问,地址中是EMR Master节点的hostname,需要在本地配置下hosts映射: local:~ root$ sudo vim /etc/hosts xx.xx.xx.xx emr-header-1.cluster-126784 9.配置后即可访问。切换到“Streaming”,点击“Completed Batches”列表中的Batch,验证正常访问:

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

加密软件:从多场景兼容性视角看企业文档防护落地

很多企业评估加密软件时,大多优先关注加解密、外发包等显性功能,却忽视跨系统、跨业务链路的兼容适配。不少项目纸面功能全部达标,上线后出现业务系统下载文件脱密、信创终端异常、沙箱盘符冲突、批量任务统计失真等隐性故障。 加密软件实际防护效果,不只取决于算法和功能清单,更取决于对企业异构复杂环境的适配能力。本文从兼容视角,梳理加密软件落地的适配要点、故障诱因与验收思路。

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

Tangdao Design 发布 1.0.1,修复兼容性,新增组件,添加后台模板页

本次更新内容如下: 修复 1、修复样式sass变量问题。 新增模板 1、新增模板、模板布局、导航 查看模板 新增组件 1、新增模式窗口 2、整理工具类 3、新增气泡卡片 4、新增进度条 5、新增步骤组件 6、新增滚动插件 7、新增加载组件 8、新增Tab标签 9、新增Toast提示组件 10、新增文字提示组件 11、新增表格组件 12、新增表单 13、新增表单布局 14、新增Select2组件 15、新增Search组件 16、新增各类图表组件 Tangdao Design 是一个优质的现代干净的Bootstrap 4中台模板,使用简单和最小的设计。它使用SASS预处理器、HTML5、CSS3和jQuery插件完全响应。它使用了大多数helper/utilities类,这些类是可重用的类,可以加快页面的速度并提高页面时间加载的速度。它可以用于大多数类型的应用程序模板,如分析、管理等程序,也可以用于您的桌面或移动应用程序。惊人的灵活性和可重用性。

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

MySQL Driver 5.1.X与6.X日期兼容性问题

1.引言 最近在一个新项目里尝试使用mysql-connector-java-6.0.5.jar,但是从MaxCompute(原名ODPS)中导入MySQL的数据在控制台中看到是正常的,从Java应用里读取的却是相差13或14小时的。甚至SQL里限定了数据的时间在某一天,应用查出来的数据还能是不在那天的。这就很奇怪了,本着求根问底,踩坑识坑的精神,好好地研究了一把。 首先看从http://search.maven.org中可以大概的看到MySQL Driver的发布历史:5.1.X和6.X版本现在正在双线演进。 2.复现问题 那么首先写一个小的JDBC程序来验证一下两个版本Driver行为的不一致,MySQL中的表如下: CREATE TABLE `demo_table` ( `id` INT(11) NULL DEFA

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

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等操作系统。

用户登录
用户注册