Files
xxcpzs/XXCpzs.Android/MainActivity.cs
2020-04-03 11:55:02 +08:00

169 lines
7.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Acr.UserDialogs;
using Android.App;
using Android.Content;
using Android.Content.PM;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Plugin.CurrentActivity;
using System;
using Xamarin.Forms;
using ZXing.Mobile;
namespace XXCpzs.Droid
{
[Activity(Label = "XXCpzs", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
internal static Context mContext { get; private set; }
internal static MainActivity Instance { get; private set; }
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
//var uiOpts = SystemUiFlags.LayoutStable | SystemUiFlags.LayoutFullscreen;
//LayoutStable表示布局稳定不随其他变动而变动
//LayoutFullscreen表示把布局拓宽到全屏幕
//Window.DecorView.SystemUiVisibility = (StatusBarVisibility)uiOpts;
//把标题栏设置为透明色
// Window.SetStatusBarColor(Android.Graphics.Color.Argb(0, 0, 0, 0));
base.OnCreate(savedInstanceState);
Instance = this;
mContext = this;
UserDialogs.Init(this);
Rg.Plugins.Popup.Popup.Init(this, savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
//初始化代码
CrossCurrentActivity.Current.Init(this, savedInstanceState);
MobileBarcodeScanner.Initialize(Application);
LoadApplication(new App());
DependencyService.Register<XXCpzs.Services.ITextToSpeechService, Services.TextToSpeechService>();
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
#region ----
/// <summary>
/// 使用DownloadManager下载安装文件
/// </summary>
/// <param name="context"></param>
/// <param name="apkAddress"></param>
public void DownloadUpdateFile(string apkAddress)
{
var apkFileName = System.IO.Path.GetFileName(apkAddress);
DownloadManager.Request request = new DownloadManager.Request(Android.Net.Uri.Parse(apkAddress));
// request.SetAllowedNetworkTypes(DownloadNetwork.Wifi);//网络环境
//request.SetDestinationInExternalPublicDir("download", "update1.apk");
request.SetDestinationInExternalFilesDir(this, Android.OS.Environment.DirectoryDownloads, apkFileName);
request.SetNotificationVisibility(DownloadVisibility.VisibleNotifyCompleted);
request.SetMimeType("application/vnd.android.package-archive");
//设置通知信息
request.SetTitle(apkFileName);
request.SetDescription("软件更新");
//设置为可见和可管理
request.SetVisibleInDownloadsUi(true);
//设置为可被媒体扫描器找到
request.AllowScanningByMediaScanner();
request.SetAllowedOverRoaming(false);
//下载管理
DownloadManager downManager = (DownloadManager)this.GetSystemService(Context.DownloadService);
//获取此次下载的ID,返回一个唯一编号(用于识别通知来源)
var refrence = downManager.Enqueue(request);
// 注册广播监听系统的下载完成事件。
IntentFilter intentFilter = new IntentFilter(DownloadManager.ActionDownloadComplete);
var boradcastReceiver = new DownloadReceiver(refrence);
this.RegisterReceiver(boradcastReceiver, intentFilter);
/*备注:服务器端apk文件mime类型为application/vnd.android.package-archive
* 需要权限:android.permission.INTERNET和android.permission.WRITE_EXTERNAL_STORAGE
*/
}
/// <summary>
/// 自定义下载更新
/// </summary>
/// <param name="context"></param>
/// <param name="apkAddress"></param>
public void DownloadUpdateFile2(Context context, String apkAddress)
{
//权限检查
if (context.CheckSelfPermission(Android.Manifest.Permission.WriteExternalStorage) != Android.Content.PM.Permission.Granted)
{
this.RequestPermissions(new string[] { Android.Manifest.Permission.WriteExternalStorage }, 1001);
return;
}
Java.IO.FileOutputStream outputStream = null;
System.IO.Stream inputStream = null;
Java.Net.HttpURLConnection connection = null;
Java.IO.File installFile = null;
try
{
var url = new Java.Net.URL(apkAddress);
connection = (Java.Net.HttpURLConnection)url.OpenConnection();
connection.ConnectTimeout = 60 * 1000;//1分钟
connection.ReadTimeout = 60 * 10 * 1000;
connection.Connect();
if (connection.ResponseCode != Java.Net.HttpStatus.Ok)
{
var errorMessage = connection.ResponseCode.ToString() + " " + connection.ResponseMessage;
return;
}
var contentLength = connection.ContentLength;
inputStream = connection.InputStream;
var downloadFile = Android.Net.Uri.FromFile(Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads));
installFile = new Java.IO.File(downloadFile.Path, System.IO.Path.GetFileName(apkAddress));
outputStream = new Java.IO.FileOutputStream(installFile, false);//需要获取存储权限
byte[] data = new byte[4096];
long total = 0;
int count;
while ((count = inputStream.Read(data, 0, data.Length)) > 0)
{
total += count;
outputStream.Write(data, 0, count);
}
}
catch (Exception ex)
{
Toast.MakeText(this, ex.Message, ToastLength.Long).Show();
}
if (outputStream != null)
outputStream.Close();
if (inputStream != null)
inputStream.Close();
if (connection != null)
connection.Disconnect();
if (installFile != null && installFile.Exists())
{
var installIntent = new Intent(Intent.ActionView);
installIntent.SetDataAndType(Android.Net.Uri.FromFile(installFile), "application/vnd.android.package-archive");
context.StartActivity(installIntent);
}
}
#endregion
}
}