unity调用安卓方法实现安装apk文件(androidx)
原文链接:点击打开
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为以下
-
<?xml version="1.0" encoding="utf-8"?>
-
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-
package="com.example.mylibrary">
-
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
-
<application>
-
<meta-data
-
android:name="com.google.android.actions"
-
android:resource="@xml/provider_paths" />
-
<!-- 适配android 7.0以及以上更新APK路径 -->
-
<provider
-
android:name="androidx.core.content.FileProvider"
-
android:authorities="${applicationId}.fileprovider"
-
android:exported="false"
-
android:grantUriPermissions="true">
-
<meta-data
-
android:name="android.support.FILE_PROVIDER_PATHS"
-
android:resource="@xml/provider_paths" />
-
</provider>
-
</application>
-
</manifest>
在res/xml中新建一个provider_paths.xml文件写法如下 <?xml version="1.0" encoding="utf-8"?><paths><external-path name="publicDir" path="."/></paths>如图所示:

新建一个java类Install提供给unity使用,代码如下:
-
package com.example.mylibrary;
-
import android.app.Activity;
-
import android.content.*;
-
import android.net.Uri;
-
import android.os.*;
-
import android.util.Log;
-
import androidx.core.content.*;
-
import com.unity3d.player.UnityPlayer;
-
import java.io.File;
-
public class Install {
-
public static boolean 安装apk(String apkPath){
-
File apkFile = new File(apkPath);
-
if (apkFile.exists()) {
-
Intent intent = new Intent(Intent.ACTION_VIEW);
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
-
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
-
Uri contentUri = FileProvider.getUriForFile(UnityPlayer.currentActivity, UnityPlayer.currentActivity.getPackageName()+".fileprovider", apkFile);
-
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
-
} else {
-
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
-
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-
}
-
UnityPlayer.currentActivity.startActivity(intent);
-
return true;
-
} else {
-
Log.d("TAG", "文件不存在"+apkPath);
-
return false;
-
}
-
}
-
}
最后点击菜单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下。代码如下:
-
void Start () {
-
StartCoroutine(把安装包写入可读写路径());
-
}
-
-
IEnumerator 把安装包写入可读写路径()
-
{
-
if (!File.Exists(Application.persistentDataPath + "/a.apk"))
-
{
-
UnityWebRequest request = UnityWebRequest.Get(Application.streamingAssetsPath + "/a.apk");
-
yield return request.SendWebRequest();
-
File.WriteAllBytes(Application.persistentDataPath + "/a.apk", request.downloadHandler.data);
-
}
-
else
-
{
-
print("已经存在,");
-
}
-
}
最终调用的方式安装apk的方法如下:
-
public static bool 安装APK(string apkPath)
-
{
-
AndroidJavaClass javaClass = new AndroidJavaClass("com.example.mylibrary.Install");
-
return javaClass.CallStatic<bool>("安装apk", apkPath);
-
}
附项目下载地址(包括安卓与unity项目):https://download.csdn.net/download/chunyu90225/13779396
unity调用安卓方法实现安装apk文件(androidx)的更多相关文章
- Unity调用安卓中的方法遇到的问题
最近在用U3D做一个简单的迷宫游戏,在项目中利用Unity制作游戏场景,在android中调用游戏场景,并在游戏结束后调用安卓方法,传递参数,退出游戏场景 查找网上资料,基本上Unity调用安卓的写法 ...
- unity接入安卓sdk (unity调用安卓工程)
1.安装jdk 并且配置环境,这个网上资料很多,这里不说了 2.安卓开发软件eclipse集成环境版 下载地址 http://tools.android-studio.org/index.php/ad ...
- Unity调用安卓Android的Toast
需求:在游戏中弹窗消息,调起安卓的Toast 项目中需要做Unity和安卓交互时,经常需要通过安卓Toast来做简单的输出,以便于测试. 方法一:Unity中,C#主导 // Unity调用安卓的土司 ...
- Android 在代码中安装 APK 文件
废话不说,上代码 private void install(String filePath) { Log.i(TAG, "开始执行安装: " + filePath); File a ...
- 解决Genymotion2.8.1在拖动安装APK文件出现ARMtranslate错误
转载文章:http://blog.csdn.net/solo_talk/article/details/68488129 在新版本的genymotion中,我们拖动安装APK文件的时候会出现一个问题, ...
- 下载更新文件后,调用安装器自动安装apk文件
在更新操作时,下载新apk之后,往往需要自动安装新apk,用以下代码即可安装下载在本地的apk文件(apkFile) Intent intent = new Intent(); intent.setA ...
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
众所周知,通过PackageManager可以获取手机端已安装的apk文件的信息,具体代码如下 PackageManager packageManager = this.getPackageManag ...
- 基于nginx实现二维码下载安装apk文件
将apk文件置于nginx目录下 <!--进入nginx安装路径--> /usr/local/nginx <!--新建放apk的目录--> mkdir -p resources ...
- android 开发 程序中下载安装APK文件 问题汇总 解析程序包时出现问题
1 若把APK文件保存到应用程序的files目录下,则一定注意保存时使用 FileOutputStream os = openFileOutput(fileName, MODE_WORLD_READA ...
随机推荐
- 普里姆(Prim)算法
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(即"带权图")里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(V ...
- 删除所有空白列 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]* ...
- crontab简单使用手册
Linux定时任务(1)- crontab 枫林风雨关注 0.1682018.12.14 12:29:47字数 946阅读 921 执行定时任务 crontab 执行循环任务 at 执行一次性任务 c ...
- 进入单用户模式修改root密码
进入单用户模式修改root密码 1.进入引导菜单界面2.按e进入grub,在linux或linux16那行结尾加上 rw init=/bin/bash,按Ctrl+x或F103.进入bash-4.3# ...
- 创建第一个django工程
一.环境搭建 使用anaconda + pycharm的环境. 1.创建虚拟环境并安装django1.8的包 # 创建虚拟环境 conda create -n django python=3.6 # ...
- Linux进阶之使用Oh-My-Zsh打造炫酷终端
Oh My Zsh是基于zsh命令行的一个扩展工具集,提供了丰富的扩展功能.除了功能增强之外,还提供非常丰富的主题.使用Oh-My-Zsh打造酷炫Shell终端的步骤(Deepin系统): 原始终端: ...
- struct位域
1 总结下 结构体位域的使用 比如 则 struct _COM2 { u8 Len : 1;//低位 u8 EoN : 2; u8 Stop:1; u8 Bps:4;//高位 } union COM ...
- 实现不同VLAN间的通信(单臂路由和链路聚合)
单臂路由与链路聚合 1.单臂路由 1.1 链路类型 1.2 子接口 2. 链路捆绑 1.单臂路由 是指在路由器的一个接口上通过配置子接口,实现原来相互隔离的不同VLAN(虚拟局域网)之间的互联互通. ...
- Docker学习(15) Docker容器的跨主机连接
Docker容器的跨主机连接 Docker使用网桥跨主机容器连接 Docker使用Open cSwitch实现跨主机容器连接 Docker使用weave实现跨主机容器连接
- TVM性能评估分析(三)
TVM性能评估分析(三) Figure 1. TVM's WebGPU backend close to native GPU performance when deploying models to ...