Unity安卓覆盖更新(7.0以上也可以哟)_山竹炒大蒜的博客-程序员宅基地

技术标签: 安卓  U3D  

再网上查了好多资料,发现更新安卓7.0以上很少,折磨了很多天,整理一下,代码是俩篇文章合在一块的,也是为了方便大家不要浪费时间,重蹈我的覆辙,参考文章 https://blog.csdn.net/wzjssssssssss/article/details/82993057https://www.jianshu.com/p/780f4a72aebe

如有侵权,联系小弟立马删除(嘿嘿)

1.下载apk

IEnumerator InstallApk()
    {
        WWW www = new WWW(url);
//下载需要更新的apk
        while (true)
        {
            Debug.Log(www.progress / 1f * 100);
            if (www.isDone)
            {
                break;
            }
            yield return null;
        }


        if (!string.IsNullOrEmpty(www.error))
        {
            Debug.Log("error:" + www.error);
            yield return 0 ;
        }

        try
        {
        //将apk写入沙盒目录
            string path = Application.persistentDataPath + "/test.apk";
            File.WriteAllBytes(path, www.bytes);
            using(AndroidJavaClass cl = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
            {
                using(AndroidJavaObject ob = cl.GetStatic<AndroidJavaObject>("currentActivity"))
                {
                //然后调用android来安装apk
                    ob.Call("InstallApk", path);
                }
            }
        }
        catch (System.Exception e)
        {
            Debug.Log(e);
        }

    }

在unity打包的apk中,一般来说,调用Android方式,通过类似

obj = new AndroidJavaObject("android.content.Intent")
obj .Call<方法返回类型>("方法名", 参数);

这样的方式调用来实现一些简单的功能,但是当实现比较复杂的功能或者代码量比较多的时候就需要考虑使用jar包或者在unity中引用库。由于是在unity中引用,所以jar包和引用库的制作和集成和原生开发有少许不同:

1.1 制作jar包并使用

以在eclipse环境下制作为例:

  1. 首先在C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes目录下拿到class.jar放入jar工程中
  2. 继承UnityPlayerActivity,如果重写onCreate方法去掉其中的setContentView()
  3. 编写自己的功能接口(继承了的好处就是在编写时候可以用UnityPlayer.currentActivity当作上下文,否则就用UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity")获取上下文)
  4. 用Export导出Jar放入Unity 的 Assets/plugins/Android/下
  5. 在C#脚本中通过AndroidJavaClass obj = new AndroidJavaClass("类的全路径"); obj.CallStatic<接口返回类型>("接口名", 参数 );调用

1.2 制作引用库

当接口功能中涉及一些权限,资源使用的时候仅仅有jar包是不够的,那么怎么把资源也同时引用进来呢


unity下的引用库目录结构:
Assets
| Plugins
|--MyCustomResources
|-- libs
|-- res
| |--- values
| |--- values-en
|-- project.properties
|-- Androidmanifest.xml

注意 project.properties和Androidmanifest.xml不能少,否则不能成功打包,其他资源参考Android工程结构目录添加

二、唤起安装界面

在android 7.0之前,实现唤起仅需要就能实现

Intent install = new Intent(Intent.ACTION_VIEW);
install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(install);

7.0之后由于系统加入了访问限制,系统的安装程序直接访问不了安装包,

对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。
如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。
要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。
进行此授权的最简单方式是使用 FileProvider 类。如需了解有关权限和共享文件的详细信息,请参阅共享文件。
--摘自Android developer

由于这个原因上面的操作在7.0以上设备上就毫无反映,虽然系统的安全更加可靠了,对于开发者来说变得麻烦了。。。 那就只好配置本应用的provider来解决了

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

filepaths文件、

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="" name="apk"/>
    </paths>
</resources>

应用下载的目标位置在存储根目录,在其他目录要更改paths节点下的内容

更改后的唤起安装页面的实现

                  if(Build.VERSION.SDK_INT>=24) {
                        Uri apkUri = FileProvider.getUriForFile(UnityPlayer.currentActivity, UnityPlayer.currentActivity.getPackageName() + ".fileProvider", file);
                        Intent install = new Intent(Intent.ACTION_VIEW);
                        install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        install.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        install.setDataAndType(apkUri, "application/vnd.android.package-archive");
                        UnityPlayer.currentActivity.startActivity(install);
                    } else{
                        Intent install = new Intent(Intent.ACTION_VIEW);
                        install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                        install.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        UnityPlayer.currentActivity.startActivity(install);
                    }

三、最后

Android的安装功能实现起来并不复杂,主要是怎么在unity下调用Android的方法以及类库的引用方式才是需要学习和记录的地方,最后希望能对阅读者有所帮助!

链接: https://pan.baidu.com/s/1QIZqq8no7Cm2mtgbZHAMNg 提取码: w6h7 

下载直接导入U3D  直接在U3D下一个方法调用即可

AndroidJavaClass obj = new AndroidJavaClass("com.am1105.installapk.MainActivity");
obj.CallStatic<bool>("invokeAndroidInstallPage", 
“apk文件的路径”
);


参考一下资料  如果侵权请联系立刻删除

https://blog.csdn.net/wzjssssssssss/article/details/82993057
https://www.jianshu.com/p/780f4a72aebe
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_40795166/article/details/85679851

智能推荐

unity中单位是米还是厘米_米和厘米都是什么单位_weixin_39851048的博客-程序员宅基地

展开全部“米”和“厘米”都是长度单位。1、长度单位是指丈e5a48de588b662616964757a686964616f31333365643661量 空间距离上的 基本单元,是人类为了规范长度而制定的基本单位。其国际单位是“ 米”(符号“m”),常用单位有 毫米(mm)、 厘米(cm)、分米(dm)、 千米(km)、米(m)、微米(μm)、纳米(nm)等等。长度单位在各个领域都有重要的作用...

jdk8.0相关特性(一)_百知_zmj的博客-程序员宅基地

JDK8.0相关特性一、JDK8.0中接口新语法JDK8.0,接口中可以定义静态的方法,带有方法的实现部分。语法:public static 返回值类型 方法名(形参列表){ //实现部分 }JDK8.0,接口中可以定义带有默认实现的非抽象方法语法:public default 返回值类型 方法名(形参列表){ // 方法实现 }二、Lambda表达式的相关语法...

6-4 修改学生成绩_戒(ʘ言ʘ╬)的博客-程序员宅基地

6-4 修改学生成绩 (25分)输入n(n&lt;50)个学生的成绩信息,再输入一个学生的学号、课程以及成绩,在自定义函数update_score()中修改该学生指定课程的成绩。函数接口定义:int update_score(struct student *p, int n, int num, int course, int score);其中p是结构指针,n是学生个数,course是课程...

Java集合框架--学习目标 & 集合概念 & Collection体系集合 & Collection接口_CodeJiao的博客-程序员宅基地

1. 学习目标集合的概念Collection接口List接口与实现类泛型和工具类Set接口与实现类Map接口与实现类2. 集合的概念2.1 概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组的功能。2.2 集合与数组的区别:数组长度固定,集合长度不固定;数组可以存储基本类型和引用类型,集合只可以存储引用类型(如果想要存储基本数据类型,可以存储基本数据类型的包装类)。2.3 位置:Java集合框架提供了一套性能优良,使用方便的接口和类,他们位于java

Nginx+keepalived实现故障切换和邮件报警_weixin_34194379的博客-程序员宅基地

拓扑图如下:实现思路是:master的优先级为100,backup的优先级为99;在master上面配置一个检测nginx监控状态的脚本(backup不用配置),当发现master的nginx故障后将master的优先级减2为98,使其backup优先级比master高,bakup获取到vip对外提供服务;当master服务器上面的nginx服务恢复正常后,master的优先...

button标签的type="submit"与type="button"的区别_wsdhla的博客-程序员宅基地

自己在做一个ajax的小例子,发现一个诡异的问题,点击页面button,调用ajax发送请求,后台方法可以成功调用,但是前台的ajax回调函数却没有执行,无论success、error、complete都没走,于是我连续快速点击按钮,发现偶尔可以成功调用success回调函数,更诡异的是,页面居然会刷新。。。。。。经过多次对比测试,终于发现问题原因:button的type属性,将typ

随便推点

Docker 中安装VIM_cmlbeliever的博客-程序员宅基地

docker容器中有许多默认是没有安装vim的,如果需要编辑配置文件的话,那么就需要手动安装vim了。如果直接使用:apt-get install vim;则会出现如下错误:Reading package lists... DoneBuilding dependency treeReading state information... DoneSome packages could n...

Linux安装部署nacos配置中心。_胡亥。的博客-程序员宅基地

Linux安装部署nacos配置中心。下载。GitHub下载地址。上传服务器,/usr/local 路径下。解压tar -zxvf nacos-server-1.3.1.tar.gz解压缩后会在同级目录生成nacos文件夹,进入该目录下的bin目录cd /usr/local/nacos/bin/修改启动脚本的Javahome路径 vim startup.sh进入cd /usr/local/nacos/conf 路径下,修改application.properties

ActiveXObject 对象 (JavaScript)_tyt叮当tyt的博客-程序员宅基地

newObj = new ActiveXObject(servername.typename[, location])参数newObj必选。   ActiveXObject 分配到的变量名称。  servername必选。  提供对象的应用程序的名称。  typename必选。  要创建的对象的类型或类。  location可选

DWR的学习笔记_cmmiao1103的博客-程序员宅基地

1.1 DWR简介         DWR是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在浏览器中的Javascript代码调用Web服务器上的Java代码,就像在Java代码就在浏览器中一样。        DWR包含2个主要部分:      1、 一个运行在服务器端的Java Servlet,它处理请求并且向浏览器发回响应。    2、运行在浏览器端的Ja...

Cannot checkout from svn:svn:E170013:Unable to connect to a repository at URL ‘‘ svn:E230001:Server._菅亚康的博客-程序员宅基地

因为IDEA保存的还是之前svn账号信息,所以check新项目是没有权限的。可以在终端通过以下步骤来修改svn账号信息打开idean的 terminal输入 svn checkout https://192.168.1.128:2666/(https://192.168.1.128:2666/ svn地址)显示选项的时候:( R)eject, accept (t)emporarily or accept §ermanently? p)输入P当显示 Pass..

【原创题】皮卡丘的兄弟姐妹_利姆露·坦派斯特的博客-程序员宅基地

题目:小智开到了皮卡丘的故乡——皮之城,城里面的所有皮卡丘都是皮卡丘的兄弟姐妹。由于原管理者即将跟随皮卡丘一起踏上征途,管理者便委托小智帮他的继任者想一个好的办法能将城中的皮卡丘都区分开来。小智一拍脑袋,给每个人一个身份证号不就好了!但是,由于小智的粗心,有M个皮卡丘的身份证号码登记错了,小智便只能规定每天都有K个皮卡丘过来查验自己的身份证号是否正确,以此来修正之前错误的登记信息。题中保证每个皮...

推荐文章

热门文章

相关标签