天天看點

xamarin android 自動更新前言

前言

最近需要做一個android的app。但是我不會java呀,雖然大學時候學過,但是完全還給老師了。于是我就用C#做了一個Android的app。如果有問題請QQ聯系1067097173

環境準備

vs2019 iis .netcore3.0 xamarin

iis用來存放釋出的apk,最終可以通過http通路下載下傳相關檔案 update存放版本号

xamarin android 自動更新前言
xamarin android 自動更新前言

具體實作

在app程式啟動方法中檢查目前的版本,然後下載下傳伺服器存放的update.txt來對比,然後把apk下載下傳到手機本地,最後更新。

具體代碼

public string GetVersion(string url)
        {
            try
            {
                WebClient client = new WebClient();
                Stream str = client.OpenRead(url);
                StreamReader reader = new StreamReader(str);
                var value = reader.ReadLine();
                return value;
            }
            catch (System.Exception exp)
            {
                Toast.MakeText(this, "更新異常:" + exp.Message, ToastLength.Long).Show();
                return "";
            }
        }

        [Obsolete]
        public void DownFile(string url)
        {

            //loading = new AlertDialog.Builder(this);
            //loading.SetTitle("下載下傳檔案");
            //loading.SetMessage("更新中...");
            //alertDialog = loading.Show();
            //progressDialogHandler = new Handler((w) =>
            //{
            //    loading.SetMessage(w.Obj.ToString());
            //    Toast.MakeText(loading.Context, w.Obj.ToString(), ToastLength.Short).Show();
            //});
            pg = new ProgressDialog(this);
            pg.SetTitle ("檔案下載下傳中...");
            pg.Max = 100;
            pg.SetCancelable(false);
            pg.SetProgressStyle(ProgressDialogStyle.Horizontal);
            pg.Show();


            try
            {
                //if (Android.OS.Environment.ExternalStorageState.Equals(Android.OS.Environment.MediaMounted))
                //{
                WebClient client = new WebClient();
                client.DownloadFileCompleted += client_DownloadFileCompleted;
                client.DownloadProgressChanged += client_DownloadProgressChanged;
                var backingFile = System.IO.Path.Combine(Xamarin.Essentials.FileSystem.AppDataDirectory, "count.txt");
                var saveFolder = Android.OS.Environment.ExternalStorageDirectory;
                //var saveFolder = Android.OS.Environment.DataDirectory;
                //if (!Android.OS.fie System.IO.Directory.Exists(saveFolder)) System.IO.Directory.CreateDirectory(saveFolder);
                var file = string.Format("{0}/{1}{2}", saveFolder, this.PackageName, ".apk");// fileName + "appName" + versionName + ext;
                file = string.Format("{0}/{1}{2}", Xamarin.Essentials.FileSystem.AppDataDirectory, this.PackageName, ".apk");
                if (System.IO.Directory.Exists(Xamarin.Essentials.FileSystem.AppDataDirectory)) { 
                
                }
                using (var fs = new FileStream(file, FileMode.Create))
                {

                }

                client.DownloadFileAsync(new Uri(url), file);

                //}
            }
            catch (System.Exception exp)
            {
                Toast.MakeText(this, "更新異常:" + exp.Message, ToastLength.Long).Show();
                ;
            }
        }
        private void OpenUpDialog(string sourcever, string updatever)
        {
            builder = new AlertDialog.Builder(this);
            builder.SetTitle("有新版本!!!").SetMessage(string.Format("目前:{0}    新版本:{1}", sourcever, updatever)).SetNeutralButton("暫不更新",
           (s, e) => {
               var UserNO = ReadData2("UserNO");
               var Userid = ReadData2("Userid");
               var password = ReadData2("Password");
               var username = ReadData2("UserName");
               if (JudgeLoginFunction(UserNO, password))
               {
                   Intent intent = new Intent(this, typeof(WebTestActivity));
                   intent.PutExtra("UserNO", UserNO);
                   intent.PutExtra("Userid", Userid);
                   intent.PutExtra("UserName", username);
                   StartActivity(intent);
               }

           }).SetPositiveButton("立即更新", (s, e) =>
           {
               DownFile(pathdir + "/" + this.PackageName + ".apk");

           }).Show();

        }
        void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            if (e.UserState == null)
            {

                //this.lblMessage.Text = e.UserState.ToString() + ",下載下傳完成";
                Intent i = new Intent(Intent.ActionView);
                var saveFolder = Android.OS.Environment.ExternalStorageDirectory;
                //if (!Android.OS.fie System.IO.Directory.Exists(saveFolder)) System.IO.Directory.CreateDirectory(saveFolder);
                var file = string.Format("{0}/{1}{2}", saveFolder, this.PackageName, ".apk");// fileName + "appName" + 
                //i.SetDataAndType(Android.Net.Uri.FromFile(new Java.IO.File(file)), "application/vnd.android.package-archive");
                //i.SetFlags(ActivityFlags.NewTask);
                file = string.Format("{0}/{1}{2}", Xamarin.Essentials.FileSystem.AppDataDirectory, this.PackageName, ".apk");
                //StartActivity(i);
                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();
        }

        void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            //this.proBarDownLoad.Minimum = 0;
            //this.proBarDownLoad.Maximum = (int)e.TotalBytesToReceive;
            //this.proBarDownLoad.Value = (int)e.BytesReceived;
            //this.lblPercent.Text = e.ProgressPercentage + "%";
            //pg.Max = (int)e.TotalBytesToReceive;
            pg.Progress = e.ProgressPercentage;
            //progressDialogHandler.SendMessage(new Message() { Obj= "更新中..."+ e.ProgressPercentage + "%" });


        }
           

注意問題

  • 1 iis部署時候 MIME類型一定要設定為”application/vnd.android.package-archive“,不然當手機下載下傳完成後不會自動提示安裝
    xamarin android 自動更新前言
  • 2 由于android版本權限控制問題,下載下傳存放的地方最好不要放的外部存儲,會報權限不足,
  • 3 高版本的android需要用fileprovider方式安裝