1.准备工作,首先需要在AndroidManifest.xml中的application中加入以下内容

        <providerandroid:name="android.support.v4.content.FileProvider"android:authorities="需要更新app的包名.fileprovider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths"/></provider>

2.在res的xml中创建filepaths.xml的文件

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path path="Android/data/当前运行app的包名/files" name="files_root" /><external-files-path path="." name="external_storage_root" />
</paths>

详情可见此参考,此链接阐述了filepaths.xml中path和代码中的关系。

Environment.getExternalStorageDirectory()过时的替代方法

 /*** 下载最新版本的apk** @param path apk下载地址*/private void downFile(final String path) {pBar = new ProgressDialog(this);pBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pBar.setCancelable(false);pBar.setTitle("正在下载...");pBar.setMessage("请稍候...");pBar.setProgress(0);pBar.show();new Thread() {public void run() {try {URL url = new URL(path);HttpURLConnection con = (HttpURLConnection) url.openConnection();con.setReadTimeout(5000);con.setConnectTimeout(5000);con.setRequestProperty("Charset", "UTF-8");con.setRequestMethod("GET");if (con.getResponseCode() == 200) {int length = con.getContentLength();// 获取文件大小InputStream is = con.getInputStream();pBar.setMax(length); // 设置进度条的总长度FileOutputStream fileOutputStream = null;if (is != null) {//对apk进行保存Log.d("路径",getExternalFilesDir(null).toString());File file = new File(getExternalFilesDir(null),"levee.apk");apkfile = file;fileOutputStream = new FileOutputStream(file);byte[] buf = new byte[1024];int ch;int process = 0;while ((ch = is.read(buf)) != -1) {fileOutputStream.write(buf, 0, ch);process += ch;pBar.setProgress(process); // 实时更新进度了}}if (fileOutputStream != null) {fileOutputStream.flush();fileOutputStream.close();}//apk下载完成,使用Handler()通知安装apkhandler.sendEmptyMessage(0);}} catch (Exception e) {e.printStackTrace();}}}.start();}
    //JSON数据不可再子线程中转换输出,要在主线程中转换输出。Handler handler = new Handler() {@SuppressLint({"HandlerLeak", "LongLogTag"})public void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what){case 0://将下载进度对话框取消pBar.cancel();//安装apk,也可以进行静默安装File apkfile = new File(getExternalFilesDir(null), "levee.apk");Intent intent = new Intent(Intent.ACTION_VIEW);if (!apkfile.exists()) {return;}
//判断是否是AndroidN以及更高的版本if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);try {String ss = "com.sina.lovepea.Androidhongdou" + ".fileprovider";Uri contentUri = FileProvider.getUriForFile(MainActivity.this.getApplicationContext(), ss, apkfile);intent.setAction(Intent.ACTION_VIEW);intent.setDataAndType(contentUri, "application/vnd.android.package-archive");} catch (Exception e) {e.printStackTrace();}} else {intent.setDataAndType(Uri.fromFile(apkfile), "application/vnd.android.package-archive");intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);}try {MainActivity.this.startActivity(intent);} catch (Exception e) {e.printStackTrace();}break;}}};

重要内容

defaultConfig {applicationId "com.sina.lovepea.AndroidHongDou" //不能与android:authorities="需要更新app的包名.fileprovider" 重名minSdkVersion build_versions.min_sdktargetSdkVersion build_versions.target_sdkversionCode 1         //需要大于上一个版本versionName "0.1.3"   //需要大于上一个版本testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

【开源项目】Android开发内置App自动升级相关推荐

  1. android 卸载内置app,安卓全机型卸载预装软件

    安卓全机型卸载预装软件是一个可以在PC端使用的安卓手机工具,它的主要功能就是卸载各种手机内置预装软件,不管是华为.小米还是三星.魅族,安卓全机型卸载预装软件都可以为你一键搞定各种应用. 功能介绍 现在 ...

  2. android 内置app,android9.0内置APP

    由于android p的代码不同于以往低版本的代码直接可以cp过去,而是在代码的编译同事check一下,多了这一个动作就导致p内置app的时候编译不过的问题,而且错误也是让人摸着头脑,特记录下以防再次 ...

  3. 实现base64格式的amr音频文件在IOS、android微信内置浏览器的播放

    参考文档: 1.https://github.com/yxl/opencore-amr-js   (将amr文件转为wav格式的编解码项目) 因为项目需要,要将amr的base46格式的音频文件在IO ...

  4. android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!

    简单基于注释的API来处理运行时6.0权限配置 热门度(没变化) 10.0/10 (没变化) ">10.0 活跃度(没变化) 0.8/10 (没变化) ">0.8 Wa ...

  5. java的开源项目哪里找,我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)...

    我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...

  6. python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...

    python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...

  7. 手把手教你使用ADB卸载手机内置App软件

    [一.前言] 不知道你们有没有那么一段黑暗时期,刚买个手机,手机上内置一堆app,还卸载不掉,然后每天各种广告,手机一共1G的运行内存,那些流氓app还要再占走一些内存,真是让人欲哭无泪啊,后来我就学 ...

  8. 推荐 12 个好用的 React 的开源项目,开发效率又能提升了!

    大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫又在线营业啦 ~ 平时如何发现好的开源项目,可以看看这篇文章:GitHub 上能挖矿的神仙技巧 - 如何发现优秀开源项目 1. react ...

  9. 报时功能_现在的智能机都没有内置整点自动报时吗?锤子坚果手机SOS有!

    事情是这样,需要给老家老人买个高配置智能机,挑来挑去没找到一个满意的,主要原因是有一个需求那就是老人不识字,需要整点自动语音报时.查看了身边几款品牌手机,有华为.LG.小米.vivo.诺基亚Nokia ...

最新文章

  1. 不通过寄存器确定数据的长度 + 案例
  2. 下载安装oracle旧版本oracle 12c的详细步骤
  3. 你知道为啥程序员下班后只关显示器从不关电脑?
  4. fastai学习——第一个bug
  5. Windows XP Embedded with Service Pack 2 开发包光盘 3CD
  6. 推动数字化智能化转型 中关村数智经济发展论坛成功举办
  7. nginx+php-fpm页面显示空白的解决方法
  8. python强制释放内存_强制Python释放对象以释放内存
  9. python 数组比较大小_python – 比较两个不同长度的numpy数组
  10. MagicKey - 魔兽世界工具(双开工具,类似按键精灵)
  11. 主板h110能装linux吗_华硕H110T +i3 8100T 组装黑苹果Mac mini安装教程
  12. 7.2.5 dps 测试软件,魔兽世界7.2.5兽王猎DPS有什么改动测试
  13. PCI Geomatica 操作视频专辑
  14. react 使用iconfont 图标
  15. 解决vscode没有文件图标(亲测有效)
  16. hive查看表中列的信息命令_Linux查看硬件信息之dmidecode命令详解
  17. Puppeteer开发过程中遇到的问题及解决方案
  18. Android 9.0中sdcard 的权限和挂载问题
  19. strtolower() 函数
  20. 怎么重置imac_macbookpro怎么恢复出厂设置

热门文章

  1. swagger api文档_带有Swagger的Spring Rest API –创建文档
  2. 使用Prometheus和Grafana监视开放自由
  3. jersey put 服务_项目学生:带有Jersey的Web服务服务器
  4. java 垃圾回收手动回收_Java垃圾回收(2)
  5. Lombok,自动值和不可变项
  6. spring分布式事务示例_Spring声明式事务示例
  7. 内存泄漏–测量频率和严重性
  8. 编写干净的测试-被认为有害的新内容
  9. Java 8 Friday:大多数内部DSL已过时
  10. 垃圾收集器准则和提示