做书籍封皮的网站,如何建网站教程视频,网站模板html整站,网站建设项目开发文章目录思路客户端权限清单#xff08;AndroidManifest.xml#xff09;权限列表(完整内容看 权限清单#xff08;AndroidManifest.xml#xff09;#xff09;打开外部应用的权限(完整内容看 权限清单#xff08;AndroidManifest.xml#xff09;#xff09;添加文件如下…
文章目录思路客户端权限清单AndroidManifest.xml权限列表(完整内容看 权限清单AndroidManifest.xml打开外部应用的权限(完整内容看 权限清单AndroidManifest.xml添加文件如下图provider_paths.xml内容升级类库代码调用代码事件回调注意这里是安卓11因为是已经确定版本了所以没做判断正确做法应该如下服务端接口注意事项在iis中或者.netcore中下载apk配置方式不一样完整代码思路
服务端提供版本信息和apk下载地址客户端通过对比版本进行文件下载安装升级
客户端
权限清单AndroidManifest.xml
?xml version1.0 encodingutf-8?
manifest xmlns:androidhttp://schemas.android.com/apk/res/android android:versionCode1 android:versionName1.0.2 packagecom.companyname.boshiac.forklift.app android:installLocationautouses-sdk android:minSdkVersion29 android:targetSdkVersion33 /application android:allowBackuptrue android:iconmipmap/ic_launcher android:labelstring/app_name android:supportsRtltrue android:themestyle/AppTheme android:usesCleartextTraffictrueprovider android:nameandroidx.core.content.FileProvider android:authoritiescom.companyname.boshiac.forklift.app.fileprovider android:exportedfalse android:grantUriPermissionstruemeta-data android:nameandroid.support.FILE_PROVIDER_PATHS android:resourcexml/provider_paths //provider/applicationuses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.MANAGE_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.RECORD_AUDIO /uses-permission android:nameandroid.permission.CAPTURE_AUDIO_OUTPUT /uses-permission android:nameandroid.permission.MODIFY_AUDIO_SETTINGS /uses-permission android:nameandroid.permission.READ_MEDIA_AUDIO /uses-permission android:nameandroid.permission.DELETE_CACHE_FILES /uses-permission android:nameandroid.permission.REQUEST_INSTALL_PACKAGES /uses-permission android:nameandroid.permission.INTERNET /
/manifest权限列表(完整内容看 权限清单AndroidManifest.xml
安装权限、文件读写权限等都是必要的权限 uses-permission android:nameandroid.permission.REQUEST_INSTALL_PACKAGES /uses-permission android:nameandroid.permission.INTERNET /uses-permission android:nameandroid.permission.READ_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.MANAGE_EXTERNAL_STORAGE /uses-permission android:nameandroid.permission.WRITE_EXTERNAL_STORAGE /打开外部应用的权限(完整内容看 权限清单AndroidManifest.xml
在application节点中加入下面代码
provider android:nameandroidx.core.content.FileProvider android:authoritiescom.companyname.boshiac.forklift.app.fileprovider android:exportedfalse android:grantUriPermissionstruemeta-data android:nameandroid.support.FILE_PROVIDER_PATHS android:resourcexml/provider_paths //provider添加文件如下图 provider_paths.xml内容
根据自己的权限需要开放对应的目录权限就可以了
?xml version1.0 encodingutf-8?
paths xmlns:androidhttp://schemas.android.com/apk/res/android!--1、对应内部内存卡根目录Context.getFileDir()--files-pathnameint_rootpath/ /!--2、对应应用默认缓存根目录Context.getCacheDir()--cache-pathnameapp_cachepath/ /!--3、对应外部内存卡根目录Environment.getExternalStorageDirectory()--external-pathnameext_rootpathpictures/ /!--4、对应外部内存卡根目录下的APP公共目录Context.getExternalFileDir(String)--external-files-pathnameext_pubpath/ /!--5、对应外部内存卡根目录下的APP缓存目录Context.getExternalCacheDir()--external-cache-pathnameext_cachepath/ //paths升级类库代码
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;namespace BOSHIAC.Forklift.App
{internal class UpgradeService{private string apkUrl;private string versionUrl;private string version;/// summary/// 更新了/// /summarypublic event Actionstring UpgradeEvent;public UpgradeService(string versionUrl, string apkUrl, string currentVersion){this.versionUrl versionUrl;this.apkUrl apkUrl;version currentVersion;}public void Start(){Task.Run(async () {var client new HttpClient();while (true){try{var response await client.GetAsync(versionUrl);var hostVersion response.Content.ReadAsStringAsync().Result;if (hostVersion ! version){using (var stream client.GetStreamAsync(apkUrl).Result){var downloaddir Application.Context.GetExternalFilesDir(Android.OS.Environment.DirectoryDownloads).AbsolutePath;var fileName Path.Combine(downloaddir, forklift.apk);if (File.Exists(fileName))File.Delete(fileName);using (var fs new FileStream(fileName, FileMode.CreateNew)){stream.CopyTo(fs);fs.Flush();UpgradeEvent?.Invoke(fileName);return;}}}}catch (Exception ex){throw;}finally{Task.Delay(TimeSpan.FromSeconds(30)).Wait();}}});}}
}调用代码 UpgradeService service new UpgradeService(http://192.168.69.82/api/Upgrade/Version, http://192.168.69.82/apks/forklift.apk, this.PackageManager.GetPackageInfo(this.PackageName, 0).VersionName);service.UpgradeEvent Service_UpgradeEvent;service.Start();事件回调 private void Service_UpgradeEvent(string file){this.RunOnUiThread(() {// var f this.PackageManager.CanRequestPackageInstalls();// this.GetPackageManager().canRequestPackageInstalls();var alertDialog new Android.App.AlertDialog.Builder(this).SetTitle(升级提示).SetMessage(检测到新的版本必须升级哦).SetIcon(Resource.Mipmap.ic_launcher).SetPositiveButton(升级, (des, dee) {try{Intent install new Intent(Intent.ActionView);Java.IO.File fileName new Java.IO.File(file);Android.Net.Uri uri FileProvider.GetUriForFile(Android.App.Application.Context, com.companyname.boshiac.forklift.app.fileprovider, fileName) ;//打开新版本应用的 install.SetFlags(ActivityFlags.NewTask);install.SetFlags(ActivityFlags.GrantReadUriPermission);install.SetDataAndType(uri, application/vnd.android.package-archive);// application/vnd.android.package-archiveStartActivity(install);}catch (System.Exception ex){;}}).SetCancelable(false).Create();alertDialog.Show();});}注意这里是安卓11因为是已经确定版本了所以没做判断正确做法应该如下 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);https://blog.csdn.net/qq_38977099/article/details/119115061 服务端接口
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.IO;namespace Boshi_HaiNan_Pda.WebApi.Controllers
{[Route(api/[controller])][ApiController]public class UpgradeController : ControllerBase{private IWebHostEnvironment environment;private string versionJsonPath;public UpgradeController(IWebHostEnvironment hostingEnvironment){environment hostingEnvironment;var dir System.IO.Path.Combine(environment.WebRootPath, apks\\);if (!Directory.Exists(dir)) Directory.CreateDirectory(dir);versionJsonPath System.IO.Path.Combine(dir, version.json); }[HttpGet(Version)]public string GetVersion(){if (!System.IO.File.Exists(versionJsonPath))return 0.0.0;return System.IO.File.ReadAllText(versionJsonPath).ToLower();} }
}
注意事项在iis中或者.netcore中下载apk配置方式不一样
在iis中配置网络上有很多文章都是配置mime”application/vnd.android.package-archive“ 这个是没有问题的如下配置
在.netcore中需要做如下配置 program.cs 或者startup文件中增加如下代码 app.UseStaticFiles(new StaticFileOptions{//FileProvider new PhysicalFileProvider(Directory.GetCurrentDirectory()),//设置不限制content-type 该设置可以下载所有类型的文件但是不建议这么设置因为不安全//下面设置可以下载apk和nupkg类型的文件ContentTypeProvider new FileExtensionContentTypeProvider(new Dictionarystring, string{{ .apk, application/vnd.android.package-archive }})}).UseStaticFiles();完整代码
https://download.csdn.net/download/iml6yu/87463366