Android各版本重要变动记录
本文来自同步博客。
Android M:运行时权限
运行时权限属于比较熟悉的话题不深入展开。除了support包可以让应用完成运行时权限,github上也有好多扩展。用得比较多的是Google官方的EasyPermissions。
Android N:提高私有文件的安全性
私有文件安全性的变动官方文档提到了三点副作用,详见文档。下面记录开发中遇见的两点。
应用间共享文件
在调用照片拍照、调用包管理器安装apk等场景下都需要跨应用共享文件。在版本N之前,直接使用“file://+文件路径”的方式就可以共享。
但是在N之后,这样操作会抛出异常FileUriExposedException。
实际上在共享文件时,接受共享的应用可能并没有向系统申请读取文件的权限,也可能没有访问该文件的权限。如果拥有者应用通过修改文件的权限,让其他任何应用都可以访问它,这显然是不安全的。
N要求使用“content://+文件路径”的方式共享文件,并在共享的那一刻生成针对指定应用的临时权限。这种分享私有文件方法,Google推荐使用FileProvider完成。
参考其他博客,这里记录两个注意点:
FileProvider是support包提供的功能,并不需要检查Android的版本进行区分处理。统一使用FileProvider向外共享文件即可。FileProvider的Available Files的配置需要注意path、name、以及paths里面的不同标签的意义。很多使用者混淆了,详细请参考官方文档。下图是某网友的总结。

DownloadManager的COLUMN_LOCAL_FILENAME字段限制
N以前的应用可以访问COLUMN_LOCAL_FILENAME字段,但是之后的版本若访问该字段,将报SecurityException。
有一种不推荐的方式可以让应用继续访问这个字段:在下载文件时,通过DownloadManager.Request.setDestinationInExternalFilesDir()或DownloadManager.Request.setDestinationInExternalPublicDir()把文件存储在公共目录。
Google推荐使用ContentResolver.openFileDescriptor()。
而我在开发中碰到需要获取下载文件最终存储的完整路径的场景,下面记录我的处理方式:
String path = "";
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
String fileUri = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
if (fileUri != null) {
path = Uri.parse(fileUri).getPath();
}
} else {
//Android 7.0以上的方式:请求获取写入权限,这一步报错过时的方式:DownloadManager.COLUMN_LOCAL_FILENAME
int fileNameIdx = c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);
path = c.getString(fileNameIdx);
}
Android O:安装非认证渠道APK
O开始屏蔽了全局的“安装未知应用”设置开关,而是将之作为权限与每个应用绑定。任何需要安装APK的应用需要在AndroidManifest中注册android.permission.REQUEST_INSTALL_PACKAGES权限,否则将无法安装应用。
可以选择使用ACTION_MANAGE_UNKNOWN_APP_SOURCES发起 Intent操作,预先将用户引导至安装未知应用权限界面。也可以使用PackageManager.canRequestPackageInstalls(),查询此权限的状态。
Android P:限制非SDK接口的使用
很庆幸也很不幸,我负责的项目没有检测到使用了非SDK接口。
有关非SDK接口相关介绍参考这篇文章。
文中提到的veridex工具需要自己下载Android的源代码,具体操作参考官方文档。
Android各版本重要变动记录的更多相关文章
- 最新Android系统版本与API等级对应关系表
最新Android系统版本与API等级对应关系表 从Android官网拷过来的,方便查阅... 官网地址:https://developer.android.com/guide/topics/mani ...
- 本地缺Android SDK版本20,Unable to resolve target 'android-20'
解决方案一 本地缺Android SDK版本20,Unable to resolve target 'android-20' 通过SDK Manager安装一个Android 20. 解决方案二: L ...
- Android 系统版本&API对照表
最新Android系统版本与API等级对应关系表 数据来源:http://d.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLe ...
- Android SDK版本和ADT版本
Android SDK版本和ADT版本 Android早期的版本号有点“混乱”,比如Android 2.2对应的ADT版本为ADT-0.9.9而Android 2.3对应的的ADT版本则突然“跃迁 ...
- Android 各个版本WebView
转载请注明出处 http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com 前言: 根据Googl ...
- Android USER 版本与ENG 版本的差异--MTK官方解释
分类: Android(4) Description]Android USER 版本与ENG 版本的差异 [Keyword]USER ENG user eng 用户版本 工程版本 差异 [Solu ...
- 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )
初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这 ...
- 基于MT6752/32平台 Android L版本驱动移植步骤
基于MT6752/32平台 Android L版本驱动移植步骤 根据MK官网所述,在Android L 版本上Turnkey ABS 架构将会phase out,而Mediatek Turnkey架构 ...
- Android各版本特性
此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...
随机推荐
- Log4Net的概念和使用
第一篇文本日志 log4net简介: log4net简介: log4net是一个功能著名的开源日志记录组件,由java平台而来. 利用log4net可以方便地将日志信息记录到文件.控制台.Window ...
- 使用免费ip代理进行投票
只要是投票系统,必然要限制一个用户投多张票. 如何限制呢?限制ip是最直观最简单的思路,可是代理池可以解决限制ip的情况. 如果投票页面前面加上一个验证码,那程序就会有点困难了. 有些投票使用微信号, ...
- C#代码规范 程序员必备的秘笈
1.引言 本文是一套面向C# programmer和C# developer进行开发所应遵循的开发规范 按照此规范来开发C#程序可带来以下益处: 代码的编写保持一致性,提高代码的可读性和可维护性,在团 ...
- android binder 机制二(client和普通server)
在讲它们之间的通信之前,我们先以MediaServer为例看看普通Server进程都在干些什么. int main() { -- // 获得ProcessState实例 sp<ProcessSt ...
- Excel导入的时候日期格式会变成double式的String数据处理
例如:java从Excel单元格读取的日期如43052.0,在后台处理的时候又需要将其处理为日期格式,使用如下代码对其进行转换即可: SimpleDateFormat sdf = new Simple ...
- Linux下的ip命令
linux的ip命令和ifconfig类似,但前者功能更强大,并旨在取代后者.使用ip命令,只需一个命令,你就能很轻松地执行一些网络管理任务.ifconfig是net-tools中已被废弃使用的一个命 ...
- TransitionsTest
CCTransitionScene* createTransition(int nIndex, float t, CCScene* s) { // fix bug #486, without setD ...
- TransitiveClosure
http://acm.nudt.edu.cn/~twcourse/TransitiveClosure.html https://en.wikipedia.org/wiki/Closure_(mathe ...
- C#中的 .NET 弱事件模式
引言 你可能知道,事件处理是内存泄漏的一个常见来源,它由不再使用的对象存留产生,你也许认为它们应该已经被回收了,但不是,并有充分的理由. 在这个短文中(期望如此),我会在 .Net 框架的上下文事件处 ...
- canvas.drawBitmap(bitmap, src, dst, paint)
// GameView.drawImage(canvas, mBitDestTop, miDTX, mBitQQ.getHeight(), mBitDestTop.getWidth(), mBitDe ...