前言
最近需要做一個android的app。但是我不會java呀,雖然大學時候學過,但是完全還給老師了。于是我就用C#做了一個Android的app。如果有問題請QQ聯系1067097173
環境準備
vs2019 iis .netcore3.0 xamarin
iis用來存放釋出的apk,最終可以通過http通路下載下傳相關檔案 update存放版本号
具體實作
在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“,不然當手機下載下傳完成後不會自動提示安裝
- 2 由于android版本權限控制問題,下載下傳存放的地方最好不要放的外部存儲,會報權限不足,
- 3 高版本的android需要用fileprovider方式安裝