本文来自同步博客

Android M:运行时权限

运行时权限属于比较熟悉的话题不深入展开。除了support包可以让应用完成运行时权限,github上也有好多扩展。用得比较多的是Google官方的EasyPermissions

Android N:提高私有文件的安全性

私有文件安全性的变动官方文档提到了三点副作用,详见文档。下面记录开发中遇见的两点。

应用间共享文件

在调用照片拍照、调用包管理器安装apk等场景下都需要跨应用共享文件。在版本N之前,直接使用“file://+文件路径”的方式就可以共享。

但是在N之后,这样操作会抛出异常FileUriExposedException

实际上在共享文件时,接受共享的应用可能并没有向系统申请读取文件的权限,也可能没有访问该文件的权限。如果拥有者应用通过修改文件的权限,让其他任何应用都可以访问它,这显然是不安全的。

N要求使用“content://+文件路径”的方式共享文件,并在共享的那一刻生成针对指定应用的临时权限。这种分享私有文件方法,Google推荐使用FileProvider完成。

参考其他博客,这里记录两个注意点:

  1. FileProvidersupport包提供的功能,并不需要检查Android的版本进行区分处理。统一使用FileProvider向外共享文件即可。
  2. FileProviderAvailable Files的配置需要注意pathname、以及paths里面的不同标签的意义。很多使用者混淆了,详细请参考官方文档。下图是某网友的总结。
 
file://与content://关系
DownloadManagerCOLUMN_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各版本重要变动记录的更多相关文章

  1. 最新Android系统版本与API等级对应关系表

    最新Android系统版本与API等级对应关系表 从Android官网拷过来的,方便查阅... 官网地址:https://developer.android.com/guide/topics/mani ...

  2. 本地缺Android SDK版本20,Unable to resolve target 'android-20'

    解决方案一 本地缺Android SDK版本20,Unable to resolve target 'android-20' 通过SDK Manager安装一个Android 20. 解决方案二: L ...

  3. Android 系统版本&API对照表

    最新Android系统版本与API等级对应关系表 数据来源:http://d.android.com/guide/topics/manifest/uses-sdk-element.html#ApiLe ...

  4. Android SDK版本和ADT版本

    Android SDK版本和ADT版本   Android早期的版本号有点“混乱”,比如Android 2.2对应的ADT版本为ADT-0.9.9而Android 2.3对应的的ADT版本则突然“跃迁 ...

  5. Android 各个版本WebView

    转载请注明出处   http://blog.csdn.net/typename/ powered by miechal zhao : miechalzhao@gmail.com 前言: 根据Googl ...

  6. Android USER 版本与ENG 版本的差异--MTK官方解释

     分类: Android(4)  Description]Android USER 版本与ENG 版本的差异 [Keyword]USER ENG user eng 用户版本 工程版本 差异 [Solu ...

  7. 【Android 应用开发】 Android 各种版本简介 ( Support 支持库版本 | Android Studio 版本 | Gradle 版本 | jcenter 库版本 )

    初学者遇到 Android Studio, 导入工程后, 会出现各种奇葩错误, 如果管理好各个插件, gradle, SDK, SDK Tools, 各种官方依赖库 的版本, 会将错误大大的减少; 这 ...

  8. 基于MT6752/32平台 Android L版本驱动移植步骤

    基于MT6752/32平台 Android L版本驱动移植步骤 根据MK官网所述,在Android L 版本上Turnkey ABS 架构将会phase out,而Mediatek Turnkey架构 ...

  9. Android各版本特性

    此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...

随机推荐

  1. 更新开源库到pods上时报CocoaPods was not able to update the `master` repo的解决办法

    今天在更新我的开源库到pods上时,使用以下命令时,报错了... pod trunk push SwiftPopMenu.podspec 错误内容: CocoaPods was not able to ...

  2. redis安装配置文件配置

    环境: 虚拟机redhat5.5安装redis4.0.2 虚拟机IP:192.168.60.130 reids端口:6379 安装步骤不详述了(可参考: 亲密接触Redis-第一天), 大致步骤如下: ...

  3. php 回收周期(Collecting Cycles)

    http://docs.php.net/manual/zh/features.gc.collecting-cycles.php 传统上,像以前的 php 用到的引用计数内存机制,无法处理循环的引用内存 ...

  4. gVim 中文内容显示为乱码的解决办法

    http://blog.csdn.net/sunmanzth/article/details/6143600打开vimrc文件,在vim的安装目录下可以找到该文件,或在windows下是在vim/gv ...

  5. python学习笔记011——内置函数pow()

    1 语法 pow(x, y[, z]) x -- 数值表达式. y -- 数值表达式. z -- 数值表达式. 函数是计算 x 的 y 次方,如果 z 在存在,则再对结果进行取模,其结果等效于pow( ...

  6. GL_会计科目子模组追溯至总账分析(案例)

    2014-06-02 BaoXinjian

  7. AME_PR采购申请单通过AME审批设定和测试(案例)

    2014-06-21 Created By BaoXinjian

  8. OGG_GoldenGate数据迁移三进程Extract / Dump / Relicat(案例)

    2014-03-04 Created By BaoXinjian

  9. SSH2框架实现注冊发短信验证码实例

    这两天開始写程序了,让用SSH2框架,曾经没有接触过Java项目更没有接触过SSH2框架,所以用注冊開始了我Java之旅.后来发现,后台代码挺easy理解的,跟.net的差点儿相同.就是层与层之间的调 ...

  10. ActiveMQ + NodeJS + Stomp 入门

    NodeJS + stomp-client 入门 准备 下载ActiveMQ并安装 执行bin\win32\activemq.bat启动MQ服务 打开http://localhost:8161/adm ...