原文链接:点击打开

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. 普里姆(Prim)算法

    概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(即"带权图")里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(V ...

  2. 删除所有空白列 cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log1 sed ‘s/[ \t]*$//g' 删除所有空格 sed -i s/[[:space:]]//g yum.log

    2.删除行末空格 代码如下: 删除所有空白列 cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log1 sed 's/[ \t]* ...

  3. crontab简单使用手册

    Linux定时任务(1)- crontab 枫林风雨关注 0.1682018.12.14 12:29:47字数 946阅读 921 执行定时任务 crontab 执行循环任务 at 执行一次性任务 c ...

  4. 进入单用户模式修改root密码

    进入单用户模式修改root密码 1.进入引导菜单界面2.按e进入grub,在linux或linux16那行结尾加上 rw init=/bin/bash,按Ctrl+x或F103.进入bash-4.3# ...

  5. 创建第一个django工程

    一.环境搭建 使用anaconda + pycharm的环境. 1.创建虚拟环境并安装django1.8的包 # 创建虚拟环境 conda create -n django python=3.6 # ...

  6. Linux进阶之使用Oh-My-Zsh打造炫酷终端

    Oh My Zsh是基于zsh命令行的一个扩展工具集,提供了丰富的扩展功能.除了功能增强之外,还提供非常丰富的主题.使用Oh-My-Zsh打造酷炫Shell终端的步骤(Deepin系统): 原始终端: ...

  7. struct位域

    1 总结下 结构体位域的使用 比如  则 struct _COM2 { u8 Len : 1;//低位 u8 EoN : 2; u8 Stop:1; u8 Bps:4;//高位 } union COM ...

  8. 实现不同VLAN间的通信(单臂路由和链路聚合)

    单臂路由与链路聚合 1.单臂路由 1.1 链路类型 1.2 子接口 2. 链路捆绑 1.单臂路由 是指在路由器的一个接口上通过配置子接口,实现原来相互隔离的不同VLAN(虚拟局域网)之间的互联互通. ...

  9. Docker学习(15) Docker容器的跨主机连接

    Docker容器的跨主机连接 Docker使用网桥跨主机容器连接 Docker使用Open cSwitch实现跨主机容器连接 Docker使用weave实现跨主机容器连接

  10. TVM性能评估分析(三)

    TVM性能评估分析(三) Figure 1. TVM's WebGPU backend close to native GPU performance when deploying models to ...