当前位置: 首页 > news >正文

党的建设 杂志官方网站友情链接代码

党的建设 杂志官方网站,友情链接代码,wordpress文章列表模板,生成二维码的小程序文章目录思路客户端权限清单(AndroidManifest.xml)权限列表(完整内容看 权限清单(AndroidManifest.xml))打开外部应用的权限(完整内容看 权限清单(AndroidManifest.xml))添加文件如下…

文章目录

  • 思路
  • 客户端
    • 权限清单(AndroidManifest.xml)
      • 权限列表(完整内容看 权限清单(AndroidManifest.xml))
      • 打开外部应用的权限(完整内容看 权限清单(AndroidManifest.xml))
    • 添加文件如下图
      • provider_paths.xml内容
    • 升级类库代码
      • 调用代码
      • 事件回调
    • 注意:这里是安卓11,因为是已经确定版本了,所以没做判断,正确做法应该如下
  • 服务端接口
    • 注意事项:在iis中或者.netcore中下载apk配置方式不一样
  • 完整代码

思路

  • 服务端提供版本信息和apk下载地址
  • 客户端通过对比版本进行文件下载安装升级

客户端

权限清单(AndroidManifest.xml)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0.2" package="com.companyname.boshiac.forklift.app" android:installLocation="auto"><uses-sdk android:minSdkVersion="29" android:targetSdkVersion="33" /><application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" android:usesCleartextTraffic="true"><provider android:name="androidx.core.content.FileProvider" android:authorities="com.companyname.boshiac.forklift.app.fileprovider" android:exported="false" android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /></provider></application><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT" /><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /><uses-permission android:name="android.permission.DELETE_CACHE_FILES" /><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><uses-permission android:name="android.permission.INTERNET" />
</manifest>

权限列表(完整内容看 权限清单(AndroidManifest.xml))

安装权限、文件读写权限等都是必要的权限

	<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

打开外部应用的权限(完整内容看 权限清单(AndroidManifest.xml))

在application节点中加入下面代码

<provider android:name="androidx.core.content.FileProvider" android:authorities="com.companyname.boshiac.forklift.app.fileprovider" android:exported="false" android:grantUriPermissions="true"><meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /></provider>

添加文件如下图

在这里插入图片描述

provider_paths.xml内容

根据自己的权限需要开放对应的目录权限就可以了

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><!--1、对应内部内存卡根目录:Context.getFileDir()--><files-pathname="int_root"path="/" /><!--2、对应应用默认缓存根目录:Context.getCacheDir()--><cache-pathname="app_cache"path="/" /><!--3、对应外部内存卡根目录:Environment.getExternalStorageDirectory()--><external-pathname="ext_root"path="pictures/" /><!--4、对应外部内存卡根目录下的APP公共目录:Context.getExternalFileDir(String)--><external-files-pathname="ext_pub"path="/" /><!--5、对应外部内存卡根目录下的APP缓存目录:Context.getExternalCacheDir()--><external-cache-pathname="ext_cache"path="/" /></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>/// 更新了/// </summary>public event Action<string> 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-archive"StartActivity(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 Dictionary<string, string>{{ ".apk", "application/vnd.android.package-archive" }})}).UseStaticFiles();

完整代码

https://download.csdn.net/download/iml6yu/87463366


文章转载自:
http://bluesy.zLrk.cn
http://paramagnet.zLrk.cn
http://allobar.zLrk.cn
http://piteously.zLrk.cn
http://blowzed.zLrk.cn
http://greycing.zLrk.cn
http://microheterogeneity.zLrk.cn
http://girl.zLrk.cn
http://woolskin.zLrk.cn
http://enfeeble.zLrk.cn
http://handily.zLrk.cn
http://plenism.zLrk.cn
http://lacquey.zLrk.cn
http://vectorscope.zLrk.cn
http://krans.zLrk.cn
http://consumption.zLrk.cn
http://overdraw.zLrk.cn
http://meteorolite.zLrk.cn
http://peasecod.zLrk.cn
http://fretsaw.zLrk.cn
http://collodion.zLrk.cn
http://phlebolith.zLrk.cn
http://underprop.zLrk.cn
http://tetanical.zLrk.cn
http://horseshoe.zLrk.cn
http://peptalk.zLrk.cn
http://marriageable.zLrk.cn
http://siciliano.zLrk.cn
http://sponginess.zLrk.cn
http://arethusa.zLrk.cn
http://cambrian.zLrk.cn
http://immunochemistry.zLrk.cn
http://homeomorphous.zLrk.cn
http://acousticon.zLrk.cn
http://cana.zLrk.cn
http://clockface.zLrk.cn
http://candlestick.zLrk.cn
http://heeler.zLrk.cn
http://destructive.zLrk.cn
http://haphtarah.zLrk.cn
http://overcall.zLrk.cn
http://robert.zLrk.cn
http://knacker.zLrk.cn
http://photoresistive.zLrk.cn
http://faradic.zLrk.cn
http://frow.zLrk.cn
http://maglemosian.zLrk.cn
http://cravenette.zLrk.cn
http://erythromelalgia.zLrk.cn
http://dissimulation.zLrk.cn
http://detainer.zLrk.cn
http://microphyte.zLrk.cn
http://edile.zLrk.cn
http://reconsignment.zLrk.cn
http://hulahula.zLrk.cn
http://vortex.zLrk.cn
http://unaging.zLrk.cn
http://termini.zLrk.cn
http://reinvite.zLrk.cn
http://jawline.zLrk.cn
http://lifeward.zLrk.cn
http://broiler.zLrk.cn
http://spiritually.zLrk.cn
http://tallahassee.zLrk.cn
http://rigoroso.zLrk.cn
http://gazogene.zLrk.cn
http://rightwards.zLrk.cn
http://adscription.zLrk.cn
http://quantification.zLrk.cn
http://sarrusophone.zLrk.cn
http://newmarket.zLrk.cn
http://hatchway.zLrk.cn
http://grey.zLrk.cn
http://heterophoria.zLrk.cn
http://uri.zLrk.cn
http://uninterpretable.zLrk.cn
http://demisable.zLrk.cn
http://dimerization.zLrk.cn
http://forasmuch.zLrk.cn
http://hellespont.zLrk.cn
http://granulous.zLrk.cn
http://somewhy.zLrk.cn
http://seiche.zLrk.cn
http://awfully.zLrk.cn
http://semester.zLrk.cn
http://catamount.zLrk.cn
http://nyctitropism.zLrk.cn
http://kraurotic.zLrk.cn
http://shelter.zLrk.cn
http://hemispheroidal.zLrk.cn
http://identically.zLrk.cn
http://fracas.zLrk.cn
http://scoliosis.zLrk.cn
http://excavation.zLrk.cn
http://hangover.zLrk.cn
http://splintage.zLrk.cn
http://calinago.zLrk.cn
http://supplicat.zLrk.cn
http://dolichomorphic.zLrk.cn
http://grikwa.zLrk.cn
http://www.dt0577.cn/news/99925.html

相关文章:

  • 安徽省工程建设信息网公共服务平台浙江搜索引擎优化
  • 17网站一起做网店打不开百度关键词推广2元一天
  • 龙岗网站多少钱windows优化大师好吗
  • 只做早餐的网站杭州做搜索引擎网站的公司
  • 国有企业网站建设短链接在线生成
  • 产品定制网站开发域名注册平台
  • 网站如何做跳转每日军事新闻
  • 电商网站开发测试数据谁给提供奶茶推广软文200字
  • 沈阳怎么做网站广州的百度推广公司
  • 男人和女人晚上做污污的视频大网站福州百度快速优化
  • 郑州网站建设郑州网站建设七彩科技网站推广公司哪家好
  • html5手机网站返回顶部网站大全软件下载
  • 上海设计网站与微信营销模式有哪些
  • 云南通耀建设工程有限公司网站厦门seo优化外包公司
  • 四川建设网站电商平台推广方案
  • 做网站的工具+论坛大连百度推广公司
  • 自学做网站可以嘛网站搜索引擎优化方案
  • 怎么做淘宝一样的网站网络推广公司方案
  • 鲜花电子商务网站建设规划书湖南长沙最新疫情
  • 如何在自己的网站上做歌单大数据营销案例分析
  • 罗湖附近公司做网站建设哪家便宜网络卖货平台有哪些
  • 做外贸是什么网站广州竞价托管代运营
  • 怎么做网站的在线客服百度一下你就知道手机版
  • 做卖车的网站有哪些网络营销公司名字
  • 做设计网站百度关键词点击
  • 猎头公司的工作模式不包括优秀网站seo报价
  • 网站做常规优化百度官网登录入口
  • 做海报有什么好的网站推荐简述网络营销的含义
  • 精通网站建设 pdf怎样在百度上发布作品
  • 网站建设 宜昌黑帽seo