【开源项目】Android开发内置App自动升级
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自动升级相关推荐
- android 卸载内置app,安卓全机型卸载预装软件
安卓全机型卸载预装软件是一个可以在PC端使用的安卓手机工具,它的主要功能就是卸载各种手机内置预装软件,不管是华为.小米还是三星.魅族,安卓全机型卸载预装软件都可以为你一键搞定各种应用. 功能介绍 现在 ...
- android 内置app,android9.0内置APP
由于android p的代码不同于以往低版本的代码直接可以cp过去,而是在代码的编译同事check一下,多了这一个动作就导致p内置app的时候编译不过的问题,而且错误也是让人摸着头脑,特记录下以防再次 ...
- 实现base64格式的amr音频文件在IOS、android微信内置浏览器的播放
参考文档: 1.https://github.com/yxl/opencore-amr-js (将amr文件转为wav格式的编解码项目) 因为项目需要,要将amr的base46格式的音频文件在IO ...
- android悬浮动态权限,android应用内悬浮窗-自动贴边,不需要权限!
简单基于注释的API来处理运行时6.0权限配置 热门度(没变化) 10.0/10 (没变化) ">10.0 活跃度(没变化) 0.8/10 (没变化) ">0.8 Wa ...
- java的开源项目哪里找,我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)...
我想参加开源项目的开发,请问在网上去哪找这样的项目? 纯C语言的(非C++或JAVA)以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起 ...
- python 元类的call_python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法...
python3 全栈开发 - 内置函数补充, 反射, 元类,__str__,__del__,exec,type,__call__方法 一, 内置函数补充 1,isinstance(obj,cls)检查 ...
- 手把手教你使用ADB卸载手机内置App软件
[一.前言] 不知道你们有没有那么一段黑暗时期,刚买个手机,手机上内置一堆app,还卸载不掉,然后每天各种广告,手机一共1G的运行内存,那些流氓app还要再占走一些内存,真是让人欲哭无泪啊,后来我就学 ...
- 推荐 12 个好用的 React 的开源项目,开发效率又能提升了!
大家好,我是你们的 猫哥,那个不喜欢吃鱼.又不喜欢喵 的超级猫又在线营业啦 ~ 平时如何发现好的开源项目,可以看看这篇文章:GitHub 上能挖矿的神仙技巧 - 如何发现优秀开源项目 1. react ...
- 报时功能_现在的智能机都没有内置整点自动报时吗?锤子坚果手机SOS有!
事情是这样,需要给老家老人买个高配置智能机,挑来挑去没找到一个满意的,主要原因是有一个需求那就是老人不识字,需要整点自动语音报时.查看了身边几款品牌手机,有华为.LG.小米.vivo.诺基亚Nokia ...
最新文章
- 不通过寄存器确定数据的长度 + 案例
- 下载安装oracle旧版本oracle 12c的详细步骤
- 你知道为啥程序员下班后只关显示器从不关电脑?
- fastai学习——第一个bug
- Windows XP Embedded with Service Pack 2 开发包光盘 3CD
- 推动数字化智能化转型 中关村数智经济发展论坛成功举办
- nginx+php-fpm页面显示空白的解决方法
- python强制释放内存_强制Python释放对象以释放内存
- python 数组比较大小_python – 比较两个不同长度的numpy数组
- MagicKey - 魔兽世界工具(双开工具,类似按键精灵)
- 主板h110能装linux吗_华硕H110T +i3 8100T 组装黑苹果Mac mini安装教程
- 7.2.5 dps 测试软件,魔兽世界7.2.5兽王猎DPS有什么改动测试
- PCI Geomatica 操作视频专辑
- react 使用iconfont 图标
- 解决vscode没有文件图标(亲测有效)
- hive查看表中列的信息命令_Linux查看硬件信息之dmidecode命令详解
- Puppeteer开发过程中遇到的问题及解决方案
- Android 9.0中sdcard 的权限和挂载问题
- strtolower() 函数
- 怎么重置imac_macbookpro怎么恢复出厂设置