原文連接:點擊打開html
unity想要實現安裝apk文件須要與安卓通信,因此須要本身來實現安卓代碼。java
第一步先要新建一個安卓項目提供給unity來使用,我這裏使用的工具是android studio4.1,而後再新建一個module選擇Android Library如圖所示。android
在此module下新建一個文件夾名字爲tempLibs 在unity安裝路徑下面找到Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes\classes.jar文件導入到該目錄下而後在build.gradle文件中的dependencies添加以下代碼compileOnly files('tempLibs/classes.jar'),最終如圖所示swift
修改AndroidManifest.xml爲如下app
-
<?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>如圖所示:ide
新建一個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文件。如圖所示:gradle
找到該arr文件導入到unity使用。接下來纔是重頭戲。我這裏使用的unity開發版本爲unity2020.2。由於unity導出的項目不支持androidx,因此須要unity支持androidx。ui
選擇unity菜單文件-生成設置-玩家設置-player,在發佈設置中勾選:自定義主要gradle模板,自定義gradle屬性模板如圖所示:google
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