【开源项目】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"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能雷达物位计说明书_?浅谈人工检尺法和雷达液位计在油罐液位测量中的应用...

近年来&#xff0c;油罐液位的测量工作已成为工业测量中十分重要的部分。过去&#xff0c;在油罐测量方面&#xff0c;人工检尺法是进行液位测量的主要方法之一&#xff0c;但随着科技的发展和进步&#xff0c;雷达液位计等智能化液位测量设备使油罐的监控和测量方式趋向于多元…

【安卓开发 】Android初级开发(九)Android中封装View提供接口供点击事件回调的方法及使用

自古一楼先上图 package com.example.mydialog;import android.app.Dialog; import android.content.Context; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.View; import android.view.Window; i…

spring 自定义日志_Spring和Hibernate的自定义审核日志

spring 自定义日志如果您需要对所有数据库操作进行自动审核 &#xff0c;并且正在使用Hibernate…&#xff0c;则应使用Envers或spring data jpa auditing 。 但是&#xff0c;如果由于某些原因您不能使用Envers&#xff0c;则可以使用Hibernate事件侦听器和spring事务同步来实…

打印pdf就一页_Excel表格打印技巧汇总,看完才发现,你连基础打印技巧都不知道...

前天被老板削了一顿&#xff0c;说我打印的表格连标题行都没有&#xff01;昨天被老板削了两顿&#xff0c;说我打印的表格太浪费纸&#xff01;今天被老板削了五顿&#xff0c;说我表格打印出来的数据居然是错误&#xff01;……在挨削了很多次之后&#xff0c;学会了一些技巧…

机器学习java_如何开始使用Java机器学习

机器学习java什么是开始使用Java机器学习的最佳工具&#xff1f; 他们已经存在了一段时间&#xff0c;但如今看来&#xff0c;每个人都在谈论人工智能和机器学习。 对于科学家和研究人员而言&#xff0c;它已经不再是秘密&#xff0c;几乎可以在任何新兴技术中实现。 在下面的…

【科学工具】矩阵篇

# codingutf-8 import numpy as np# 矩阵加法 Matrix addition ,同型矩阵可以加减操作&#xff0c;即行列数相等 A np.array([[3, 2, 1], [1, 2, 3]]) B np.array([[3, 2, 1], [1, 2, 3]]) print(A B)# 矩阵数乘 Matrix multiplication C np.array([3, 2, 1]) print (C * 2…

nginx delete form表单 收不到参数_HTTP 文件上传的一个后端完善方案(NginX)

(给PHP开发者加星标&#xff0c;提升PHP技能)转自&#xff1a;林伯格https://breeze2.github.io/blog/scheme-nginx-php-js-upload-process前言很多网站都会有上传文件的功能&#xff0c;比如上传用户头像&#xff0c;上传个人简历等等&#xff0c;除非是网盘类的网站&#xff…

fegin 参数丢失_许多参数和丢失的信息

fegin 参数丢失代码越少越好&#xff1f; 对象越少越好&#xff1f; 是真的吗 像往常一样&#xff0c;这取决于。 在某些情况下&#xff0c;通过添加更多内容&#xff0c;我们会添加不必要的复杂性。 当我们仅出于“将来可能需要这种额外的灵活性”而创建接口或其他抽象时&…

【安卓开发 】Android初级开发(十)Android中app自动更新版本号比较

//版本号比较:前者小返回true&#xff0c;前者大返回false public static boolean versionCompareTo(String version1, String version2) {Log.d("输出第一个参数",version1);Log.d("输出第二个参数",version2);version1 version1 null ? "" …

高通写号工具_高通推出桌面平台新ARM处理器并认为我们的电脑性能没必要那么高...

高通公司在日前举办的骁龙技术峰会上宣布推出骁龙7c / 8c处理器 , 这些处理器全部都是面向笔记本电脑推出的。这也是高通和微软合作推出 Windows 10 ARM 设备的组成部分 , 高通希望能够在桌面平台挑战英特尔统治地位。如果你有印象的话或许还记得高通此前推出的骁龙 8cx芯片组&…

java创建一个不可变对象_使用不可变对象创建值对象

java创建一个不可变对象在回答我最近的文章中AutoValue&#xff1a;生成的不可变的值类 &#xff0c; 布兰登认为&#xff0c;这可能是有趣的&#xff0c;看看如何AutoValue比较项目Lombok和Immutables和凯文借调这一点。 我同意这是一个好主意&#xff0c;但是我首先将这篇文章…

混合高斯模型_高斯混合模型(GMM)

下图所示&#xff0c;显然用右边的图描述当前分布更加合理&#xff0c;即应用了两个高斯分布。图中每一个样本点同时属于任何一个高斯模型。高斯混合模型 从几何角度来理解&#xff0c;GMM是由多个高斯分布叠加而成&#xff0c;可以看做是多个高斯分布的加权平均。其中&#x…

【安卓开发 】Android初级开发(网络操作)

URI部分 URI详情 uri的具体案例使用参考&#xff0c;app与网页之间的页面跳转 H5唤醒app并跳转到指定页面 H5打开APP技术总结 H5页面唤醒app的方法 Android配置Scheme使用浏览器唤起APP的方式&#xff0c;以及不生效问题解决 网页唤起app,并传值到app中使用的全过程 and…

dynamodb java_使用Java第2部分查询DynamoDB项

dynamodb java在上一篇文章中&#xff0c;我们有机会发布了一些基本的DynamoDB查询操作。 但是&#xff0c;除了基本操作之外&#xff0c;DynamoDB api还为我们提供了一些额外的功能。 投影是具有类似选择功能的功能。 您选择应从DynamoDB项中提取哪些属性。 请记住&#xf…

【H.264/AVC视频编解码技术】第五章【哈夫曼编码】

本文章所需要的内容需要自行准备一个名为input.txt的文本文件作为案例演示。内容选择英语小短文即可 第一步,建立哈夫曼数 #include <iostream> #include <fstream> #include <queue> #include <vector> #include <string>using namespace st…

gitpython git diff_Python全栈开发-git常用命令

欢迎关注我的号Python全栈开发-git常用命令​mp.weixin.qq.com### Python全栈开发-git常用命令本节内容- github介绍- 安装- 仓库创建& 提交代码- 代码回滚- 工作区和暂存区- 撤销修改- 删除操作- 远程仓库- 分支管理- 多人协作- github使用- 忽略特殊文件.gitignore### 2.…

来的多可选_您的框架有多可扩展性?

来的多可选在参加会议时&#xff0c;我们总是会遇到高素质的决策者&#xff0c;他们经常问同样的问题&#xff1a; 您的框架有多可扩展性&#xff1f;如果我需要的比您开箱即用的功能还多呢&#xff1f; 。 这个问题非常合理&#xff0c;因为他们只是不想被卡在开发曲线的中间&…

【H.264/AVC视频编解码技术】第六章【指数哥伦布编码】

H264中语法元素描述符 指数哥伦布 (Exponential-Golomb) 熵编码 指数哥伦布编码同哈夫曼编码一样,都是变长编码。 二者的显著区别: 信源相关性:哈夫曼编码依赖于信源的概率分布;指数哥伦布与信源无关。 额外信息:哈夫曼编码的数据必须额外携带与信源匹配的码表;指…

python素描效果_python实现图片素描效果

代码如下&#xff1a;from PIL import Image #图像处理模块import numpy as npa np.asarray(Image.open("这里是原图片的路径").convert(L)).astype(float)#将图像以灰度图的方式打开并将数据转为float存入np中depth 10. # (0-100)grad np.gradient(a) #取图像灰度…

java 认证_Java认证:认证或不认证

java 认证专业认证始终是一个有争议的主题&#xff0c;有资格的人在争论收益与成本/时间的关系。 通过Oracle的Java认证&#xff0c;我认为有两个主要的受众可以从中受益&#xff1a; 那些开始从事软件事业的人。 扎实的工作经验和可证明的代码将永远是潜在雇主的首要考虑因素…