Unity调用Android下载APK功能以及各种坑


前言

最近在做Unity实现Android更新,即在unity界面点击某个按钮后,跳转到指定apk的系统安装界面,实现更新和下载apk的功能。把此期间遇到的种种问题


一、首先实现unity和Android的通信

1.一切的功能建立在unity和Android可以互通信的情况下,案例网上大把的有,在此说几点,Android的工程的包名可以和unity打包的包名不一致。只要在mainfest文件里声明mainactivity的地方写对就可以了。

在这里插入图片描述
2.当可以建立后,才发现可以通过调用不同的AndroidJavaObject来实现对同Android里同module下其他包进行调用。新手Android刚知道。。大佬勿喷。

unity里的调用
Android里面的结构

二、安装apk的方法。

1.安装方法

代码如下(示例):

/**
     * 安装代码块
     */
    public void installApp(String apkPath) {
    
    
        File apkFile = new File(apkPath);
        if (!apkFile.exists()) {
    
    
            Utils.showToast("apk不存在!",false);
            return;
        }

        Intent intent = new Intent(Intent.ACTION_VIEW);


        if (apkFile.getName().endsWith(".apk")) {
    
    

            try {
    
    
                //兼容7.0
                Uri uri;
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    
     // 适配Android 7系统版本
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
                    uri = FileProvider.getUriForFile(Utils.getContext(),   Utils.getContext().getPackageName() +".fileprovider", apkFile);//通过FileProvider创建一个content类型的Uri

                } else {
    
    
                    uri = Uri.fromFile(apkFile);
                }

                intent.setDataAndType(uri, "application/vnd.android.package-archive"); // 对应apk类型
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            } catch (Exception e) {
    
    
                e.printStackTrace();
            }
        } else {
    
    
            Utils.showToast("不是apk文件!",false);
        }

        //弹出安装界面
        Utils.getContext().startActivity(intent);
    }

Utils.getContext()方法里是返回UnityPlayer.currentActivity;

2.AndroidManifest.xml

代码如下(示例):

  <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.FFTAI.GameFramework.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths"/>
  </provider>

最主要的就是android:authorities=“com.FFTAI.GameFramework.fileprovider”
这个一定要和安装apk方法里面的
uri = FileProvider.getUriForFile(Utils.getContext(), “com.FFTAI.GameFramework.fileprovider", apkFile);
的第二个参数保持一致

3.遇到的坑

1.FileProvider.getUriForFile()一直报空,
这个问题经查都说是两个authorities不一致导致,但是我确保每一个字符都对了还是为空。

解决办法:
最终还是通过打包成aar包解决的。之前一直是通过打包jar包放进去。

2.触发安装apk功能后,屏幕闪一下,就返回untiy应用中,但实际上apk已经在后台下载。

解决办法:
这个是因为手机Android 8之后增加了未知应用访问权限的问题。所以只要在AndroidManifest中添加
<uses-permissionandroid:name=“android.permission.REQUEST_INSTALL_PACKAGES” />即可

3.下载后出现双图标的问题,只需要将AndroidManifest中的这两行删除即可

 <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

总结

以上就是今天要讲的内容,主要是记录下自己开发过程中遇到的坑,希望可以对遇到同样问题的小伙伴提供一些帮助,毕竟这两天,百度打开的网页至少有上百个了。-。-太难了。

猜你喜欢

转载自blog.csdn.net/weixin_43295183/article/details/109103307
今日推荐