原文链接:点击打开

unity想要实现安装apk文件需要与安卓通讯,所以需要自己来实现安卓代码。

第一步先要新建一个安卓项目提供给unity来使用,我这里使用的工具是android studio4.1,然后再新建一个module选择Android Library如图所示。

在此module下新建一个文件夹名字为tempLibs 在unity安装路径下面找到Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar文件导入到该目录下然后在build.gradle文件中的dependencies添加如下代码compileOnly files('tempLibs/classes.jar'),最终如图所示

修改AndroidManifest.xml为以下


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.example.mylibrary">
  4. <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
  5. <application>
  6. <meta-data
  7. android:name="com.google.android.actions"
  8. android:resource="@xml/provider_paths" />
  9. <!-- 适配android 7.0以及以上更新APK路径 -->
  10. <provider
  11. android:name="androidx.core.content.FileProvider"
  12. android:authorities="${applicationId}.fileprovider"
  13. android:exported="false"
  14. android:grantUriPermissions="true">
  15. <meta-data
  16. android:name="android.support.FILE_PROVIDER_PATHS"
  17. android:resource="@xml/provider_paths" />
  18. </provider>
  19. </application>
  20. </manifest>

在res/xml中新建一个provider_paths.xml文件写法如下 <?xml version="1.0" encoding="utf-8"?><paths><external-path name="publicDir" path="."/></paths>如图所示:

新建一个java类Install提供给unity使用,代码如下:


  1. package com.example.mylibrary;
  2. import android.app.Activity;
  3. import android.content.*;
  4. import android.net.Uri;
  5. import android.os.*;
  6. import android.util.Log;
  7. import androidx.core.content.*;
  8. import com.unity3d.player.UnityPlayer;
  9. import java.io.File;
  10. public class Install {
  11. public static boolean 安装apk(String apkPath){
  12. File apkFile = new File(apkPath);
  13. if (apkFile.exists()) {
  14. Intent intent = new Intent(Intent.ACTION_VIEW);
  15. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
  16. intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  17. Uri contentUri = FileProvider.getUriForFile(UnityPlayer.currentActivity, UnityPlayer.currentActivity.getPackageName()+".fileprovider", apkFile);
  18. intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
  19. } else {
  20. intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
  21. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  22. }
  23. UnityPlayer.currentActivity.startActivity(intent);
  24. return true;
  25. } else {
  26. Log.d("TAG", "文件不存在"+apkPath);
  27. return false;
  28. }
  29. }
  30. }

最后点击菜单buid-Make Project将会生成arr文件。如图所示:

找到该arr文件导入到unity使用。接下来才是重头戏。我这里使用的unity开发版本为unity2020.2。因为unity导出的项目不支持androidx,所以需要unity支持androidx。

选择unity菜单文件-生成设置-玩家设置-player,在发布设置中勾选:自定义主要gradle模板,自定义gradle属性模板如图所示:

unity将会在asset\Plugins\Android生成两个文件gradleTemplate.properties和mainTemplate.gradle,需要分别修改这两个文件。先用记事本打开gradleTemplate.properties文件在最后一行加上以下代码:android.overridePathCheck=true

android.useAndroidX=true
android.enableJetifier=true

如图所示:

然后再修改mainTemplate.gradle文件,在dependencies 块中添加一行代码: implementation 'androidx.appcompat:appcompat:1.2.0'如图所示:

这样基本就算大功告成就算调用了。首先随便找一个apk安装包放在StreamingAssets先命名成a.apk。由于unity不能直接读取StreamingAssets下面的文件所以最好在项目启动时拷贝到可读写路径persistentDataPath下。代码如下:


  1. void Start () {
  2. StartCoroutine(把安装包写入可读写路径());
  3. }
  4. IEnumerator 把安装包写入可读写路径()
  5. {
  6. if (!File.Exists(Application.persistentDataPath + "/a.apk"))
  7. {
  8. UnityWebRequest request = UnityWebRequest.Get(Application.streamingAssetsPath + "/a.apk");
  9. yield return request.SendWebRequest();
  10. File.WriteAllBytes(Application.persistentDataPath + "/a.apk", request.downloadHandler.data);
  11. }
  12. else
  13. {
  14. print("已经存在,");
  15. }
  16. }

最终调用的方式安装apk的方法如下:


  1. public static bool 安装APK(string apkPath)
  2. {
  3. AndroidJavaClass javaClass = new AndroidJavaClass("com.example.mylibrary.Install");
  4. return javaClass.CallStatic<bool>("安装apk", apkPath);
  5. }

附项目下载地址(包括安卓与unity项目):https://download.csdn.net/download/chunyu90225/13779396

unity调用安卓方法实现安装apk文件(androidx)的更多相关文章

  1. Unity调用安卓中的方法遇到的问题

    最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...

  2. unity接入安卓sdk (unity调用安卓工程)

    1.安装jdk 并且配置环境,这个网上资料很多,这里不说了 2.安卓开发软件eclipse集成环境版 下载地址 http://tools.android-studio.org/index.php/ad ...

  3. Unity调用安卓Android的Toast

    需求:在游戏中弹窗消息,调起安卓的Toast 项目中需要做Unity和安卓交互时,经常需要通过安卓Toast来做简单的输出,以便于测试. 方法一:Unity中,C#主导 // Unity调用安卓的土司 ...

  4. Android 在代码中安装 APK 文件

    废话不说,上代码 private void install(String filePath) { Log.i(TAG, "开始执行安装: " + filePath); File a ...

  5. 解决Genymotion2.8.1在拖动安装APK文件出现ARMtranslate错误

    转载文章:http://blog.csdn.net/solo_talk/article/details/68488129 在新版本的genymotion中,我们拖动安装APK文件的时候会出现一个问题, ...

  6. 下载更新文件后,调用安装器自动安装apk文件

    在更新操作时,下载新apk之后,往往需要自动安装新apk,用以下代码即可安装下载在本地的apk文件(apkFile) Intent intent = new Intent(); intent.setA ...

  7. 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)

    众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...

  8. 基于nginx实现二维码下载安装apk文件

    将apk文件置于nginx目录下 <!--进入nginx安装路径--> /usr/local/nginx <!--新建放apk的目录--> mkdir -p resources ...

  9. android 开发 程序中下载安装APK文件 问题汇总 解析程序包时出现问题

    1 若把APK文件保存到应用程序的files目录下,则一定注意保存时使用 FileOutputStream os = openFileOutput(fileName, MODE_WORLD_READA ...

随机推荐

  1. 进程间IPC通信-stop waiting for thing to happen,go out and make them happen!!!

    进程间通信: System V IPC对象: ipcs -q:查看消息队列   ipcs -m:查看共享内存 ipcs -s:查看信号灯集 ipcrm -q:删除消息队列   ipcrm -m:删除共 ...

  2. Zabbix 监控过程详解

    Zabbix 监控过程详解 一.修改密码及中文语言 修改密码 修改中文语言 如果复选框中没有 Chinese(zh_CN) 选项,需要安装中文包 [root@Zabbix-server ~]# yum ...

  3. 055.Python前端Django模型ORM

    由于前面在centos实验的过程中,pymql一直有属性错误,很难排查出问题,重新做了一个ubuntu的桌面系统同时使用pycharm开发工具作为学习开发工具,具体原因是因为在项目命名出现问题,和自己 ...

  4. linux进阶之SVN集中式版本控制系统篇

    代码上线--版本控制系统 SVN             集中式版本控制系统 git                 分布式版本控制系统 SVN是subversion的缩写,即版本控制系统,是一个开放 ...

  5. Spring AOP 框架

    引言 要掌握 Spring AOP 框架,需要弄明白 AOP 的概念. AOP 概念 AOP(Aspect Oriented Programming的缩写,翻译为面向方面或面向切面编程),通过预编译方 ...

  6. 在Linux服务器,搭建K8s服务【脚本篇】

    前言 好久没有写博客了,本文主要是对网上文章的总结篇,主要是将安装和运行代码做了一次真机实验,亲测可用.文章内包含的脚本和代码,多来自于网络,也有我自己的调整和配置,文章末尾对参考的文献做了列举,方便 ...

  7. 项目实践之工作流引擎基本文档!Activiti工作流框架中流程引擎API和服务详解

    流程引擎的API和服务 流程引擎API(ProcessEngine API)是与Activiti打交道的最常用方式 Activiti从ProcessEngine开始.在ProcessEngine中,可 ...

  8. vue相关面试知识点总结

    vue v-for循环中为什么要用key?为什么index不能作为key? key 的特殊 attribute 主要用在 Vue 的虚拟 DOM 算法,在新旧 nodes 对比时辨识 VNodes.如 ...

  9. Django(43)restful接口规范

    restful接口规范   什么是接口规范?接口规范就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据.如何写接口:接口规范是规范化书写接口的,写接口要写url.响应数据 ​  注:如果将 ...

  10. Python爬取微信小程序(Charles)

    Python爬取微信小程序(Charles) 本文链接:https://blog.csdn.net/HeyShHeyou/article/details/90045204 一.前言 最近需要获取微信小 ...