在写这边文章的时候参考了很多其他人的博客,在此感谢各位。也是给其他的伙伴做一个总结。对于我们新手来说存在的问题还是比较多的。

一、搭建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自动升级的更多相关文章

  1. C# Xamarin For Android自动升级项目实战

    一.课程介绍 “明人不说暗话,跟着阿笨一起玩Xamarin”,本次分享课程阿笨将带来大家一起学习Xamarin For Android系列<C# Xamarin For Android自动升级项 ...

  2. delphi android 自动升级

    用IdHTTP1下载文件到手机完成. 调用自动安装不行. First chance exception at $DFC22519. Exception class EJNIException with ...

  3. Android 一s个相对完整的自动升级功能实现代码

    由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...

  4. Android 一个相对完整的自动升级功能实现代码

    由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...

  5. Ionic实战 自动升级APP(Android版)

    Ionic 框架介绍 Ionic是一个基于Angularjs.可以使用HTML5构建混合移动应用的用户界面框架,它自称为是"本地与HTML5的结合".该框架提供了很多基本的移动用户 ...

  6. Android 实现应用升级方案(暨第三方自动升级服务无法使用后的解决方案)

    第三方推送升级服务不再靠谱: 以前在做Android开发的时候,在应用升级方面都是使用的第三方推送升级服务,但是目前因为一些非技术性的问题,一些第三方厂商不再提供自动升级服务,比如友盟,那么当第三方推 ...

  7. Android自动检测版本及自动升级

    步骤: 1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:versionName. 2.从服务器获取版本号(版本号存在于xml文件中) ...

  8. Ionic4.x、Cordova Android 检测应用版本号、服务器下载文件以及实现App自动升级、安装

    Android App 升级执行流程 1.获取本地版本号 2.请求服务器获取服务器版本号 3.本地版本和服务器版本不一致提示升级,弹窗提示用户是否更新 4.用户确定升级,调用文件传输方法下载 apk ...

  9. 【转】Xamarin.Android 入门之:Xamarin+vs2015 环境搭建

    Xamarin.Android 入门之:Xamarin+vs2015 环境搭建   一.前言 此篇博客主要写了如何使用搭建xamarin开发的环境,防止我自己万一哪天电脑重装系统了,可以直接看这篇博客 ...

  10. Xamarin.Android通知详解

    一.发送通知的机制 在日常的app应用中经常需要使用通知,因为服务.广播后台活动如果有事件需要通知用户,则需要通过通知栏显示,而在Xamarin.Android下的通知需要获取Notification ...

随机推荐

  1. ProxySQL的双层用户认证机制

    转载自:https://www.likecs.com/show-203802325.html 如果使用了ProxySQL来做中间路由,那么与我们平时登录数据库有一些区别:平时我们直接使用数据库的用户密 ...

  2. Helm3 安装 ElasticSearch & Kibana 7.x 版本

    文章转载自:http://www.mydlq.club/article/13/ 系统环境: helm 版本:v3.2.1 Kubernetes 版本:1.18.3 ElasticSearch Char ...

  3. 几篇关于MySQL数据同步到Elasticsearch的文章---第四篇:使用go-mysql-elasticsearch同步mysql数据库信息到ElasticSearch

    文章转载自: https://www.cnblogs.com/dalaoyang/p/11018541.html 1.go-mysql-elasticsearch简介 go-mysql-elastic ...

  4. aardio + AutoHotkey 混合编程

    本文主要介绍 aardio + AutoHotkey 混合编程. 在 aardio 中可以调用很多编程语言,例如 C语言.C++.C#.Java.Python.R.Javascript.Node.Js ...

  5. day43-反射02

    2.Class类 2.1基本介绍 Class类也是类,因此也继承Object类 Class类对象不是new出来的,而是系统创建的 对于某个类的Class类对象,在内存中只有一份,因为类只加载一次 每个 ...

  6. [题解] Codeforces Dytechlab Cup 2022 1737 A B C D E 题解

    傻*Dytechlab还我rating!(不过目前rating还没加上去,据说E是偷的说不定要unrated) 实在没预料到会打成这样... 求点赞 点我看题 A. Ela Sorting Books ...

  7. 工厂方法在Spring源码中的运用

    我们都知道Spring中IOC是使用的工厂模式,但是对于实现细节就一知半解了,今天这篇文章就带大家解读Spring中是如何使用工厂模式的. 在上篇文章中我们懂了什么是工厂模式,这篇文章就带着学过的概念 ...

  8. 一篇文章带你掌握MyBatis简化框架——MyBatisPlus

    一篇文章带你掌握MyBatis简化框架--MyBatisPlus 我们在前面的文章中已经学习了目前开发所需的主流框架 类似于我们所学习的SpringBoot框架用于简化Spring开发,我们的国人大大 ...

  9. break ,continue,retrun的区别

    break ,continue,retrun的区别 1:break 在循环体内结束整个循环过程 for (var i = 1; i <= 5; i++) { if(i == 3){ break; ...

  10. 19.-哈希算法&注册登录

    一.哈希算法 哈希: 给定明文-计算出一段定长的-不可逆的值 定长输出:不管明文输入多少,哈希都是定长的 不可逆:无法反向计算出对应的明文 雪崩效应:输入改变,输出必然变 md5:32位16进制   ...