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

posted @ 2021-06-16 19:28  yassine  阅读(1143)  评论(1编辑  收藏  举报