unity調用安卓方法實現安裝apk文件(androidx)

原文連接:點擊打開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

  
  
           
  
  
  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>如圖所示:ide

新建一個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文件。如圖所示: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下。代碼以下:

  
  
           
  
  
  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

相關文章
相關標籤/搜索