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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/240553.html
標籤:其他
