xamarin.Android自动升级
在写这边文章的时候参考了很多其他人的博客,在此感谢各位。也是给其他的伙伴做一个总结。对于我们新手来说存在的问题还是比较多的。
一、搭建iis服务器
首先我们需要搭建一个可以提供app下载最新版本的网站。在这里直接使用iis服务器。具体搭建方法就不再介绍了。这里需要注意的是要添加mime类型。这样子才能够下载apk文件。具体方法请参考:https://blog.csdn.net/wsx5edc/article/details/88867019
好了iis服务器搭建完成后。放上我们新的apk安装包。
如何生成apk文件包具体方法请参考:https://www.cnblogs.com/hexu6788/p/10007336.html
然后同时创建一个txt文件里面放着我们最新版号。我这里是直接使用程序集版本号。update.txt文件里面直接写1.0.0.1
到这里服务端就搭建完成了。
二、编写app升级代码
然后就是app文件的代码实现了。我是参考
https://blog.csdn.net/u011821152/article/details/112966956?spm=1001.2014.3001.5501
并根据自己的需求做了一些修改。
首先在程序启动的时候,读取iis服务器的update文件,对比一下当前的程序版本和服务端的是否一致。如果不一致开始下载操作
//判断是否有新的版本需要更新
WebClient client = new WebClient();
Stream str = client.OpenRead("http://WWW.XXX.COM/update.txt");
StreamReader reader = new StreamReader(str);
var value = reader.ReadLine();
var ver = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
//对比版本号
if (ver != value)
{
//显示弹窗提示用户有新的版本需要更新
var builder = new Android.App.AlertDialog.Builder(this);
builder.SetTitle("有新版本!").SetMessage("请更新后进行使用,若是更新失败请联系公司管理员!当前安装版本为"+ ver + "最新版本为"+value).SetNegativeButton("确定", (e, s) =>
{
//版本不一致调用升级方法
runUpdate();
}).Show();
}
在方法体的外部定义一个 ProgressDialog字段。代表进度条窗口
ProgressDialog pg;//进度条
public void runUpdate()
{
pg = new ProgressDialog(this);
pg.SetTitle("文件下载中...");
pg.Max = 100;
pg.SetCancelable(false);
pg.SetProgressStyle(ProgressDialogStyle.Horizontal);
pg.Show();
WebClient client = new WebClient();
//传输过程中更新进度条
client.DownloadProgressChanged += client_DownloadProgressChanged;
//在异步下载完成时候发生
client.DownloadFileCompleted += client_DownloadFileCompleted;
//下载文件
var saveFolder = Android.OS.Environment.ExternalStorageDirectory;
var file = string.Format("{0}/{1}{2}", saveFolder, this.PackageName, ".apk");//fileName + "appName" + versionName + ext;
client.DownloadFileAsync(new Uri("http://www.xxx.cn:/xxx.apk"), file);
}
//更新进度条
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
pg.Progress = e.ProgressPercentage;
}
/// <summary>
/// 下载完成时进行安装
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.UserState == null)
{
Intent i = new Intent(Intent.ActionView);
var saveFolder = Android.OS.Environment.ExternalStorageDirectory;
var file = string.Format("{0}/{1}{2}", saveFolder, this.PackageName, ".apk");
Java.IO.File apkFile = new Java.IO.File(file);
Intent intent = new Intent(Intent.ActionView);
intent.SetFlags(ActivityFlags.NewTask);
if (Build.VERSION.SdkInt >= BuildVersionCodes.N)
{
intent.SetFlags(ActivityFlags.GrantReadUriPermission);
Android.Net.Uri uri = FileProvider.GetUriForFile(this, PackageName + ".fileprovider", apkFile);
intent.SetDataAndType(uri, "application/vnd.android.package-archive");
}
else
{
intent.SetDataAndType(Android.Net.Uri.FromFile(new Java.IO.File(file)), "application/vnd.android.package-archive");
}
StartActivity(intent);
}
if (e.Error != null)
{
Toast.MakeText(this, "更新异常:" + e.Error.Message, ToastLength.Long).Show();
}
pg.Dismiss();
}
三、可能出现的异常解决方法
需要注意的是 Android 7.0到来后,为了进一步提高私有文件的安全性,Android不再由开发者放宽私有文件的访问权限,之前我们一直使用"file:///"绝对路径来传递文件地址的方式,
在接收方访问时会触发SecurityException的异常。
因此在提供文件给第三方应用访问时,我们就会用到FileProvider。
具体方法参考:https://www.cnblogs.com/devin_zhou/p/8520706.html
在下载完毕后进入安装过程中会出现应用未安装的错误
具体解决方法参考:https://blog.csdn.net/daijin888888/article/details/48413847
xamarin.Android自动升级的更多相关文章
- C# Xamarin For Android自动升级项目实战
一.课程介绍 “明人不说暗话,跟着阿笨一起玩Xamarin”,本次分享课程阿笨将带来大家一起学习Xamarin For Android系列<C# Xamarin For Android自动升级项 ...
- delphi android 自动升级
用IdHTTP1下载文件到手机完成. 调用自动安装不行. First chance exception at $DFC22519. Exception class EJNIException with ...
- Android 一s个相对完整的自动升级功能实现代码
由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...
- Android 一个相对完整的自动升级功能实现代码
由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...
- Ionic实战 自动升级APP(Android版)
Ionic 框架介绍 Ionic是一个基于Angularjs.可以使用HTML5构建混合移动应用的用户界面框架,它自称为是"本地与HTML5的结合".该框架提供了很多基本的移动用户 ...
- Android 实现应用升级方案(暨第三方自动升级服务无法使用后的解决方案)
第三方推送升级服务不再靠谱: 以前在做Android开发的时候,在应用升级方面都是使用的第三方推送升级服务,但是目前因为一些非技术性的问题,一些第三方厂商不再提供自动升级服务,比如友盟,那么当第三方推 ...
- Android自动检测版本及自动升级
步骤: 1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName. 2.从服务器获取版本号(版本号存在于xml文件中) ...
- Ionic4.x、Cordova Android 检测应用版本号、服务器下载文件以及实现App自动升级、安装
Android App 升级执行流程 1.获取本地版本号 2.请求服务器获取服务器版本号 3.本地版本和服务器版本不一致提示升级,弹窗提示用户是否更新 4.用户确定升级,调用文件传输方法下载 apk ...
- 【转】Xamarin.Android 入门之:Xamarin+vs2015 环境搭建
Xamarin.Android 入门之:Xamarin+vs2015 环境搭建 一.前言 此篇博客主要写了如何使用搭建xamarin开发的环境,防止我自己万一哪天电脑重装系统了,可以直接看这篇博客 ...
- Xamarin.Android通知详解
一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取Notification ...
随机推荐
- CMake | 将路径添加到 CMAKE_PREFIX_PATH
1. CMAKE_PREFIX_PATH CMAKE_PREFIX_PATH是一个分号分隔的路径列表,用来指明软件/库安装路径前缀,以供find_package(),find_program(),fi ...
- k8s驱逐篇(4)-kube-scheduler抢占调度驱逐
介绍kube-scheduler抢占调度驱逐之前,先简单的介绍下kube-scheduler组件: kube-scheduler简介 kube-scheduler组件是kubernetes中的核心组件 ...
- Windows Server Backup保留副本数量的问题
在配置Windows Server Backup的时候可以配置备份时间点和备份存放位置,但是无法配置保留备份的数量.作为微软提供的一个基本的备份工具,做简单的备份还是可以的.但是对于同一备份任务,反复 ...
- 使用docker-compose.yml安装rabbitmq集群
1.拉取镜像 集群中每个节点都需要执行 docker pull rabbitmq:3.8.3-management 2.上传docker-compose文件,设置可执行权限 相关文地址:https:/ ...
- python运行以及入门语法基础
pycharm下载与使用 1.pycharm官网下载(直接到pycharm下载地址) http://www.jetbrains.com/pycharm/download/#section=window ...
- C++面向对象编程之转换函数、explicit、one-argument
1.转换函数 转换函数不需要返回值和参数,直接 "operator 类型名称() {}" ,类型名称就决定了返回值: 在一开始在执行 d = 4 + f; 时,先看有木有重载 + ...
- C语言小白刷题
1.有n个评委,他们给出score个分数,请用代码写出平均值,ave代表平均值 2022-10-15 13:17:10 int main() { int n, i =1, score, sum = 0 ...
- 2022-08-12-esp32把玩记-②_用Micropython点ssd1306_oled屏幕
layout: post cid: 8 title: esp32把玩记-② 用Micropython点ssd1306 oled屏幕 slug: 8 date: 2022/08/12 15:12:39 ...
- RMarkdown进阶操作
技术背景 Markdown大家都比较熟悉了,特别是在写程序文档和写数学公式时,拥有着无与伦比的便利性.同时在前面的一篇博客中我们介绍了使用RMarkdown去写Latex Beamer演示文档的方法, ...
- 知识图谱-生物信息学-医学论文(Chip-2022)-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用
16.(2022)Chip-BCKG-基于临床指南的中国乳腺癌知识图谱的构建与应用 论文标题: Construction and Application of Chinese Breast Cance ...