随着Android版本越来越高,Android对隐私的保护力度也越来越大。这些隐私权限的更改在为用户带来更加安全的操作系统的同时也为开发者带来了一些新的任务。如何让你的APP能够适应这些改变而不是崩溃,是每一位Android开发者必须要了解学习的。

一.引言

Android 6.0引入了动态权限控制.

Android 7.0 引入了私有目录被限制访问和StrictMode API ,在7.0上应用私有目录将被限制访问,这与iOS的沙盒机制类似,StrictMode API是指禁止向你的应用外公开 file:// URI。 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,则会报出异常。这项权限的变更将意味着你无法通过File API访问手机存储上的数据了,基于File API的一些文件浏览器等也将受到很大的影响.

所以在7.0系统上,给其他应用传递 file:// URI 类型的Uri,可能会导致接受者无法访问该路径。 因此,在Android7.0中尝试传递 file:// URI 会触发 FileUriExposedException。解决办法就是可以通过使用FileProvider来解决这一问题.

二. 两种实现自动下载安装方式

两种下载方式入口:

/**

* @param context

* @param apkUrl APK下载路径

* @param fileName APK下载自定义名称

* @param webViewMode 是否是浏览器模式下载*/

public static voidinstall(Context context, String apkUrl, String fileName, boolean webViewMode) {if(webViewMode) {

downloadByWeb(context, apkUrl);

}else{

downloadBySelf(context, apkUrl, fileName);

}

}

1. 通过手机内置浏览器来下载安装更新APP.

这种方式将下载和安装更新操作交给浏览器操作了,很简单,但是这种也是不受控的.有时候浏览器会推荐一系列的广告App伴随下载,不小心就会中招.

//通过浏览器方式下载并安装

private static voiddownloadByWeb(Context context, String apkPath) {

Uri uri=Uri.parse(apkPath);//String android.intent.action.VIEW 比较通用,会根据用户的数据类型打开相应的Activity。如:浏览器,电话,播放器,地图

Intent intent = newIntent(Intent.ACTION_VIEW, uri);

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(intent);

}

2. 通过DownloadManager 下载APK,并提示安装

2.1 通过DownloadManager

private static voiddownloadBySelf(Context context, String apkUrl, String fileName) {if(TextUtils.isEmpty(apkUrl)) {return;

}try{

Uri uri=Uri.parse(apkUrl);

DownloadManager downloadManager=(DownloadManager) context

.getSystemService(Context.DOWNLOAD_SERVICE);

DownloadManager.Request request= newDownloadManager.Request(uri);//在通知栏中显示

request.setVisibleInDownloadsUi(true);

request.setTitle("应用更新");

request.setDescription("本次更新描述")//MIME_MapTable是所有文件的后缀名所对应的MIME类型的一个String数组 {".apk", "application/vnd.android.package-archive"},

request.setMimeType("application/vnd.android.package-archive");//在通知栏通知下载中和下载完成//下载完成后该Notification才会被显示

if (Build.VERSION.SDK_INT >Build.VERSION_CODES.HONEYCOMB) {//Android 3.0版本 以后才有该方法//在下载过程中通知栏会一直显示该下载的Notification,在下载完成后该Notification会继续显示,直到用户点击该Notification或者消除该Notification

request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

}

String filePath= null;if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {//外部存储卡

filePath =Environment.getExternalStorageDirectory().getAbsolutePath();

}else{

Log.i(TAG,"没有SD卡");return;

}

downloadUpdateApkFilePath= filePath + File.separator + fileName + System.currentTimeMillis() + ".apk";//若存在,则删除 (这里具体逻辑具体看,我这里是删除)

deleteFile(downloadUpdateApkFilePath);

Uri fileUri= Uri.fromFile(newFile(downloadUpdateApkFilePath));

request.setDestinationUri(fileUri);//下载管理Id

downloadManager.enqueue(request);

DownloadReceiver mDownloaderReceiver= newDownloadReceiver();//注册下载完成广播

context.registerReceiver(mDownloaderReceiver, newIntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

}catch(Exception e) {

e.printStackTrace();//注意:如果文件下载失败则 使用浏览器下载//downloadByWeb(context, apkUrl);

}

}

2.2 通过广播监控下载完成,调至提示用户安装操作.

/**

* 下载完成的广播*/

public static classDownloadReceiver extends BroadcastReceiver {

@Overridepublic voidonReceive(Context context, Intent intent) {if (!TextUtils.isEmpty(downloadUpdateApkFilePath)) {

installNormal(context, downloadUpdateApkFilePath);

}

}

}

2.3 提示用户安装或者更新

/**

* 提示安装

* @param context 上下文

* @param apkPath apk下载完成在手机中的路径*/

private static voidinstallNormal(Context context, String apkPath) {

Intent intent= newIntent(Intent.ACTION_VIEW);//版本在7.0以上是不能直接通过uri访问的

if (Build.VERSION.SDK_INT >Build.VERSION_CODES.N) {

File file= (newFile(apkPath));//由于没有在Activity环境下启动Activity,设置下面的标签

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//参数1:上下文, 参数2:Provider主机地址 和配置文件中保持一致,参数3:共享的文件

Uri apkUri = FileProvider.getUriForFile(context, "com.xinxianshi.fileprovider", file);//添加这一句表示对目标应用临时授权该Uri所代表的文件

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

intent.setDataAndType(apkUri,"application/vnd.android.package-archive");

}else{

intent.setDataAndType(Uri.fromFile(newFile(apkPath)),"application/vnd.android.package-archive");

}

context.startActivity(intent);

}

三. 补充

MIME_MapTable是所有文件的后缀名所对应的MIME类型的一个String数组

//{后缀名,MIME类型}

{".3gp", "video/3gpp"},

{".apk", "application/vnd.android.package-archive"},

{".asf", "video/x-ms-asf"},

{".avi", "video/x-msvideo"},

{".bin", "application/octet-stream"},

{".bmp", "image/bmp"},

{".c", "text/plain"},

{".class", "application/octet-stream"},

{".conf", "text/plain"},

{".cpp", "text/plain"},

{".doc", "application/msword"},

{".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},

{".xls", "application/vnd.ms-excel"},

{".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},

{".exe", "application/octet-stream"},

{".gif", "image/gif"},

{".gtar", "application/x-gtar"},

{".gz", "application/x-gzip"},

{".h", "text/plain"},

{".htm", "text/html"},

{".html", "text/html"},

{".jar", "application/java-archive"},

{".java", "text/plain"},

{".jpeg", "image/jpeg"},

{".jpg", "image/jpeg"},

{".js", "application/x-javascript"},

{".log", "text/plain"},

{".m3u", "audio/x-mpegurl"},

{".m4a", "audio/mp4a-latm"},

{".m4b", "audio/mp4a-latm"},

{".m4p", "audio/mp4a-latm"},

{".m4u", "video/vnd.mpegurl"},

{".m4v", "video/x-m4v"},

{".mov", "video/quicktime"},

{".mp2", "audio/x-mpeg"},

{".mp3", "audio/x-mpeg"},

{".mp4", "video/mp4"},

{".mpc", "application/vnd.mpohun.certificate"},

{".mpe", "video/mpeg"},

{".mpeg", "video/mpeg"},

{".mpg", "video/mpeg"},

{".mpg4", "video/mp4"},

{".mpga", "audio/mpeg"},

{".msg", "application/vnd.ms-outlook"},

{".ogg", "audio/ogg"},

{".pdf", "application/pdf"},

{".png", "image/png"},

{".pps", "application/vnd.ms-powerpoint"},

{".ppt", "application/vnd.ms-powerpoint"},

{".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},

{".prop", "text/plain"},

{".rc", "text/plain"},

{".rmvb", "audio/x-pn-realaudio"},

{".rtf", "application/rtf"},

{".sh", "text/plain"},

{".tar", "application/x-tar"},

{".tgz", "application/x-compressed"},

{".txt", "text/plain"},

{".wav", "audio/x-wav"},

{".wma", "audio/x-ms-wma"},

{".wmv", "audio/x-ms-wmv"},

{".wps", "application/vnd.ms-works"},

{".xml", "text/plain"},

{".z", "application/x-compress"},

{".zip", "application/x-zip-compressed"},

{"", "*/*"}

原文:https://www.cnblogs.com/bugzone/p/strictMode.html

android下载后的app自动安装,Android 7.0 下载APK后自动安装相关推荐

  1. 基于Android的看小说APP源码Android本科毕业设计Android小说阅读器、小说APP源码

    基于kotlin + 协程 + MVVM 模式来编写的看小说APP. 完整代码下载地址:基于Android的看小说APP源码Android本科毕业设计Android小说阅读器.小说APP源码 主要框架 ...

  2. android 7.0下载地址,安卓7.0系统手机下载安装教程 Android7.0下载地址

    导 读 安卓系统几乎是普及了所有人的手机,虽然6.0的安装率有点惨不忍睹,但是最近谷歌又有了新动作,在即将推出的安卓7.0系统又有哪些值得我们期待的功能呢?下面和小编一起去看看吧! 虽然Android ...

  3. 基于android的家庭理财app系统(android毕业设计)

    每个家庭都希望过幸福美满的生活,但大多数人可能一生都无法满足.现代生活中我们除了追求精神上的财富不可缺少的也要追求房子.车子.高档理财等这些象征物质财富的东西.生活质量的保证,还是多数人努力追求的目标 ...

  4. android调用另一app的xml,Android 7.0+调用其他App打开文件

    ​ 近期需要用到读取Android设备外存中的JSON和Word,在前期开发时用于调试的是Android 6.0的米4,当拿到实际应用环境(Android 7.0)时,Android 6.0之后的版本 ...

  5. 在豌豆荚安卓市场下载了伪造的ES文件管理器,该流氓apk会自动的下载手机游戏

    在豌豆荚安卓应用市场查找ES文件管理器,这是android平台比较流行的文件管理软件.找到一个如下的图所示的: 网址在http://www.wandoujia.com/apps/com.amaze.f ...

  6. mysql zip win10安装_mysql 8.0.16 Win10 zip版本安装配置图文教程

    本文为大家分享了mysql 8.0.16  Win10 zip版本安装配置图文教程,供大家参考,具体内容如下 首先去mysql官网下载mysql最新版本 1.选择如图所示 community 2.点击 ...

  7. Anaconda3安装tensorflow 2.0版本cpu和gpu安装,Win10系统

    tensorflow是在anaconda上安装的,所以先安装anconda 一.安装anaconda3 我安装的是这一个,anaconda自带python,所以不需要单独安装python 点击安装,一 ...

  8. Windows Mobile 6.0 SDK和中文模拟器下载 Windows Mobile 6.5 模拟器(附5.0下载)

    SDK 6.0下载页面: http://www.microsoft.com/downloads/details.aspx?familyid=06111A3A-A651-4745-88EF-3D4809 ...

  9. 飞翔机器人动态壁纸_长臂机器人(HandyBot)官方下载_长臂机器人官方安卓v1.0下载_快吧游戏...

    长臂机器人 安卓版是一款迷宫式的冒险推理游戏,喜欢休闲益智类的手游玩家肯定会喜欢的,游戏中玩家将操作这我们的主角长臂机器人进行行动,来通过一关关的关卡,还在等什么?快来下载长臂机器人官网安卓v1.0体 ...

  10. android 日语 app下载,学一下APP(学一下日语)V1.0.1 安卓正式版

    学一下APP(学一下日语)是一个非常强大和全面学习语言的学习工具.如果您有足够的知识,则可以共享自己的知识.它可以为用户创造一个非常好的外语学习环境.无论您是学习英语还是日语,这里都可以帮助您找到高质 ...

最新文章

  1. java 创建日程到期提醒_苹果“快捷指令”日程播报完美版
  2. 英特尔核显自定义分辨率_华为推出两款MateBook D系列笔记本:搭载英特尔11代酷睿...
  3. matlab+nnf.m,中南大学-信号与系统matlab实验报告.doc
  4. javasript 面向对象
  5. ssas 分层维度_通过SSAS维度层次结构增强数据分析
  6. 语音识别软件、语音识别平台和语音识别技术
  7. 使用highcharts绘制图表,如何在tooltip里显示服务器端的其他数据
  8. 百度计算步行泰山18盘只要15分钟
  9. 新浪微博html怎么设置,如何切换新浪微博的账户
  10. 类似Jira的十大项目管理软件
  11. server宕机监控、检測、报警程序(139绑定手机短信报警)monitor_down.sh
  12. python 方向盘_码农:科目二(可以摸方向盘了)
  13. 壳聚糖/纳米金水凝胶/纳米木质素/掺杂二硫化钼/微米级Ag2O2掺杂壳聚糖水凝胶的制备研究
  14. 全球与中国无线充电芯片市场深度研究分析报告
  15. 砸盘、销号、解散社群,Merlin Lab“跑路三连”暴露了DeFi哪些问题?
  16. 微信小程序云开发之云数据库
  17. ubuntu上打开markdown文件
  18. python绘制网络拓扑图_python绘制网络拓扑_网络拓扑的python表示
  19. 英文版Windows XP的中文支持设置
  20. Go-ecc加密解密详解与代码

热门文章

  1. 卷积有多少种?一文读懂深度学习中的各种卷积
  2. 又有两所一流高校加入“不返校”阵营,非毕业年级学生,开学时间待定!
  3. k8s概念入门之control-manager-针对1.1.版本阅读
  4. 亲测可以使用的:Maven将中央仓库修改为阿里云的maven仓库
  5. 机器学习中Bagging和Boosting的区别
  6. AXM-Net:用于行人检测的跨模式上下文注意力网络
  7. 用于目标检测的半自动视频标注
  8. 关于Silverlight_Tools.exe安装不上的问题
  9. zabbix--监控MySQL主从状态
  10. postgre 常用语法,如 group_concat用法