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

一、搭建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. HTTP 优缺点

    HTTP 最凸出的优点是「简单.灵活和易于扩展.应用广泛和跨平台」. 1. 简单HTTP 基本的报文格式就是 header + body ,头部信息也是 key-value 简单文本的形式,易于理解, ...

  2. Spring Boot2配置Swagger2生成API接口文档

    一.Swagger2介绍 前后端分离开发模式中,api文档是最好的沟通方式. Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 及时性 (接 ...

  3. 理解virt、res、shr之间的关系(linux系统篇)

    前言 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题--你的程序在运行时占用了多少内存(物理内存)? 通常我们可以通过top命令查看进程占用了多少内存.这里我们可 ...

  4. day41-网络编程03

    Java网络编程03 5.UDP网络通信编程[了解] 5.1基本介绍 类DatagramSocket 和 DatagramPacket[数据报/数据包]实现了基于 UDP的协议网络程序 UDP数据报通 ...

  5. 第六章:Django 综合篇 - 3:使用MySQL数据库

    在实际生产环境,Django是不可能使用SQLite这种轻量级的基于文件的数据库作为生产数据库.一般较多的会选择MySQL. 下面介绍一下如何在Django中使用MySQL数据库. 一.安装MySQL ...

  6. echarts pie饼状图绑定点击事件

    var valueData = [ {value: 33,name: '诊所'}, {value: 29,name: '汽车服务相关'}, {value: 27, name: '洗衣店'}, {val ...

  7. Dapr 长程测试和混沌测试

    介绍 这是Dapr的特色项目,具体参见: https://github.com/dapr/test-infra/issues/11 ,在全天候运行的应用程序中保持Dapr可靠性至关重要.在部署真正的应 ...

  8. 在开发中关于javaweb中的路径问题小结

    转自http://blog.csdn.net/yinyuehepijiu/article/details/9136117 在javaweb项目中添加配置文件,满足连接数据库配置参数以及其他自定义参数存 ...

  9. 5.ElasticSearch系列之文档的基本操作

    1. 文档写入 # create document. 自动生成 _id POST users/_doc { "user" : "shenjian", " ...

  10. 如何使用IDEA自动生成类图

    然后再类里边按 Ctrl+Alt+U 然后就会生成类图,这个样子 然后怎样把生成的类图搞出来.当然是使用截图软件啦.微信上的截图软件和qq上的截图软件好像都不在阔以,你一点击截图按钮.生成的类图就会消 ...