unity 发布apk,在应用内下载安装apk(用于更大大版本)

*注意事项:

  •   1,andriod 7.0 和 android 8.0是安卓系统的分水岭,需要分开来去实现相关内容2,注意自己的包名,在设置一些共享文件的时候需要放自己的包名3,以下是直接用arr包放入unity中直接使用的,不需要导入unity的class.jar包
    

步骤:
准备工作:
1.在main的文件下面新建一个file_paths.xml文件
代码:

<?xml version="1.0" encoding="utf-8"?>
<resources><paths><!--external-path: 该方式提供在外部存储区域根目录下的文件。它对应Environment.getExternalStorageDirectory返回的路径external-files-path: Context.getExternalFilesDir(null)external-cache-path: Context.getExternalCacheDir(String)--><external-path name="download" path="" /></paths></resources>

2.在AndrioManifest.xml的中添加一下代码

       <providerandroid:name="androidx.core.content.FileProvider"android:authorities= "你的包名"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>

案例代码如下:
在这里插入图片描述
3.在unity的plungs的android下面的andriodManifest.xml里新增一句,开启安装的权限

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

案例如下
在这里插入图片描述
最终是最重要代码,在androidstudio里面新增一个安装的类InstallUtil,同时解决android 8.0和 android 7.0问题代码如下

package com.gomore.pigfarm.util;import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.Settings;
import android.util.Log;import androidx.annotation.RequiresApi;
import androidx.core.content.FileProvider;import java.io.File;public class InstallUtil {private static final int UNKNOWN_CODE = 2020;//外部调用public static void installApk(Context context, String path) {//8.0及以上if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {//  unityActivity.showToast("8");startInstallO(context, path);//7.0及以上} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {//unityActivity.showToast("7");startInstallN(context, path);//7.0 以下} else {startInstall(context, path);}}/*** android1.x-6.x** @param path 文件的路径*/public static void startInstall(Context context, String path) {Intent install = new Intent(Intent.ACTION_VIEW);install.setDataAndType(Uri.parse("file://" + path), "application/vnd.android.package-archive");install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(install);}/*** android7.x** @param path 文件路径*/@RequiresApi(api = Build.VERSION_CODES.N)public static void startInstallN(Context context, String path) {String authority = "填自己的包名";try {// unityActivity.showToast("进入组装安装7");//参数1 上下文, 参数2 在AndroidManifest中的android:authorities值, 参数3 共享的文件Uri apkUri = FileProvider.getUriForFile(context, authority, new File(path));Intent install = new Intent(Intent.ACTION_VIEW);//由于没有在Activity环境下启动Activity,设置下面的标签install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//添加这一句表示对目标应用临时授权该Uri所代表的文件install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);install.setDataAndType(apkUri, "application/vnd.android.package-archive");context.startActivity(install);} catch (Exception e) {e.printStackTrace();Log.d("S","startInstallN: " + e.getMessage());}}//private static final String TAG = "InstallUtil";/*** android8.x*/@RequiresApi(api = Build.VERSION_CODES.O)private static void startInstallO(final Context context, String path) {boolean isGranted = context.getPackageManager().canRequestPackageInstalls();if (isGranted) {startInstallN(context, path);//安装应用的逻辑(写自己的就可以)// unityActivity.showToast("开始安装应用8");}else {//  unityActivity.showToast("开始安装应用未授权");new AlertDialog.Builder(context).setCancelable(false).setTitle("安装应用需要打开未知来源权限,请去设置中开启权限").setPositiveButton("确定", new DialogInterface.OnClickListener() {public void onClick(DialogInterface d, int w) {// unityActivity.showToast("安装8");Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);Activity act = (Activity) context;act.startActivityForResult(intent, UNKNOWN_CODE);}}).show();}}
}

最后打包运行可以安装,不懂的可留言哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/117379.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

尚硅谷SpringMVC (5-8)

五、域对象共享数据 1、使用ServletAPI向request域对象共享数据 首页&#xff1a; Controller public class TestController {RequestMapping("/")public String index(){return "index";} } <!DOCTYPE html> <html lang"en" xmln…

安达发|APS软件排程规则及异常处理方案详解

随着科技的发展&#xff0c;工业生产逐渐向智能化、自动化方向发展。APS(高级计划与排程)软件作为一种集成了先进技术和理念的工业软件&#xff0c;可以帮助企业实现生产过程的优化和控制。其中&#xff0c;排程规则是APS软件的核心功能之一&#xff0c;它可以帮助企业合理安排…

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现CNN-BiGRU卷积双向门控循环单元时间序列预测&#xff1b; 2.运行环境…

Docker技术--Docker简介和架构

1.Docker简介 (1).引入 我们之前学习了EXSI&#xff0c;对于虚拟化技术有所了解&#xff0c;但是我们发现类似于EXSI这样比较传统的虚拟化技术是存在着一定的缺陷:所占用的资源比较多&#xff0c;简单的说&#xff0c;就是你需要给每一个用户提供一个操作平台&#xff0c;这一个…

一款windows的终端神奇,类似mac的iTem2

终于找到了一款windows的终端神奇。类似mac的iTem2 来&#xff0c;上神器 cmder cmder是一款windows的命令行工具&#xff0c;就是我们的linux的终端&#xff0c;用起来和linux的命令一样。所以我们今天要做的是安装并配置cmder ![在这里插入图片描述](https://img-blog.csdni…

Lnmp架构-Redis

网站&#xff1a;www.redis.cn redis 部署 make的时候需要gcc和make 如果在纯净的环境下需要执行此命令 [rootserver3 redis-6.2.4]# yum install make gcc -y 注释一下这几行 vim /etc/redis/6739.conf 2.Redis主从复制 设置 11 是master 12 13 是slave 在12 上 其他节…

python 深度学习 解决遇到的报错问题4

目录 一、DLL load failed while importing _imaging: 找不到指定的模块 二、Cartopy安装失败 三、simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 四、raise IndexError("single positional indexer is out-of-bounds") 五、T…

QT Creator工具介绍及使用

一、QT的基本概念 QT主要用于图形化界面的开发&#xff0c; QT是基于C编写的一套界面相关的类库&#xff0c;如进程线程库&#xff0c;网络编程的库&#xff0c;数据库操作的库&#xff0c;文件操作的库等。 如何使用这个类库&#xff1a;类库实例化对象(构造函数) --> 学习…

简单了解ICMP协议

目录 一、什么是ICMP协议&#xff1f; 二、ICMP如何工作&#xff1f; 三、ICMP报文格式 四、ICMP的作用 五、ICMP的典型应用 5.1 Ping程序 5.2 Tracert(Traceroute)路径追踪程序 一、什么是ICMP协议&#xff1f; ICMP因特网控制报文协议是一个差错报告机制&#xff0c;…

【【萌新的STM32学习-18 中断的基本概念3】】

萌新的STM32学习-18 中断的基本概念3 EXTI和IO映射的关系 AFIO简介&#xff08;F1&#xff09; Alternate Function IO 复用功能IO 主要用于重映射和外部中断映射配置 1.调试IO配置 来自AFIO_MAPR[26:24] , 配置JTAG/SWD的开关状态 &#xff08;这个我们并不用太过深刻的关注&…

腾讯云网站备案详细流程_审核时间说明

腾讯云网站备案流程先填写基础信息、主体信息和网站信息&#xff0c;然后提交备案后等待腾讯云初审&#xff0c;初审通过后进行短信核验&#xff0c;最后等待各省管局审核&#xff0c;前面腾讯云初审时间1到2天左右&#xff0c;最长时间是等待管局审核时间&#xff0c;网站备案…

【易售小程序项目】修改“我的”界面前端实现;查看、重新编辑、下架自己发布的商品【后端基于若依管理系统开发】

文章目录 “我的”界面修改效果界面实现界面整体代码 查看已发布商品界面效果商品数据表后端上架、下架商品ControllerMapper 界面整体代码back方法 编辑商品、商品发布、保存草稿后端商品校验方法Controller 页面整体代码 “我的”界面修改 效果 界面实现 界面的实现使用了一…

DevOps理念:开发与运维的融合

在现代软件开发领域&#xff0c;DevOps 不仅仅是一个流行的词汇&#xff0c;更是一种文化、一种哲学和一种方法论。DevOps 的核心理念是通过开发和运维之间的紧密合作&#xff0c;实现快速交付、高质量和持续创新。本文将深入探讨 DevOps 文化的重要性、原则以及如何在团队中实…

Python入门教程 - 基本语法 (一)

目录 一、注释 二、Python的六种数据类型 三、字符串、数字 控制台输出练习 四、变量及基本运算 五、type()语句查看数据的类型 六、字符串的3种不同定义方式 七、数据类型之间的转换 八、标识符命名规则规范 九、算数运算符 十、赋值运算符 十一、字符串扩展 11.1…

Ubuntu20.04下安装搜狗输入法Linux版

Ubuntu20.04下安装搜狗输入法Linux版 参考搜狗输入法的官网安装指南&#xff1b; 第一步&#xff1a;打开搜狗输入法官网&#xff1b; https://shurufa.sogou.com/ 点击X86_64后将会自动跳转到搜狗输入法的安装指南中&#xff1b; 安装指南 Ubuntu搜狗输入法安装指南 搜狗…

iOS开发Swift-7-得分,问题序号,约束对象,提示框,类方法与静态方法-趣味问答App

1.根据用户回答计算得分 ViewController.swift: import UIKitclass ViewController: UIViewController {var questionIndex 0var score 0IBOutlet weak var questionLabel: UILabel!IBOutlet weak var scoreLabel: UILabel!override func viewDidLoad() {super.viewDidLoad()…

如何停止一个正在运行的线程

使用共享变量的方式 在这种方式中&#xff0c;之所以引入共享变量&#xff0c;是因为该变量可以被多个执行相同任务的线程用来作为是否中断的信号&#xff0c;通知中断线程的执行。 使用interrupt方法终止线程 如果一个线程由于等待某些事件的发生而被阻塞&#xff0c;又该怎样…

Vavido IP核Independent Clocks Block RAM FIFO简述

文章目录 1 FIFO&#xff08;先入先出&#xff09;1.1 概念1.2 应用场景1.3 FIFO信号1.4 FIFO读写时序1.4.1 FIFO读时序1.4.2 FIFO写时序 参考 1 FIFO&#xff08;先入先出&#xff09; 1.1 概念 FIFO&#xff08;First in First out&#xff09;即先入先出队列&#xff0c;是…

2023年高教社杯 国赛数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

2023应届生java面试紧张失误之一:CAS口误说成开心锁-笑坏面试官

源于&#xff1a;XX网&#xff0c;如果冒犯&#xff0c;表示歉意 面试官&#xff1a;什么是CAS 我&#xff1a;这个简单&#xff0c;开心锁 面试官&#xff1a;WTF&#xff1f; 我&#xff1a;一脸自信&#xff0c;对&#xff0c;就是这个 面试官&#xff1a;哈哈大笑&#xff…