解决:安卓7.0以上自动更新无法安装问题

我是做unity开发的,当需要调用安卓原生的功能的时候往往会遇到很多权限的问题,没有系统的去学过安卓,遇到这样的问题只能去百度、google,但是解决这样问题的博客太多了,好多说的也都不对,要么有的只解决了7.0的,现在我给大家介绍一下我这边怎么解决的,包括安卓8.0。
我主要针对unity开发人员说一下,其它的应该都差不多,只是调用方式有区别。
对于unity开发人员,怎么调用安卓,我在这里也不做过多的说明,不会的可以看一下雨松MOMO的博客,或者其它博客,我现在假设大家都已经创建了一个最基本安卓项目了,在你现有的项目上来写这个功能。我们需要的调用安卓的功能其实很简单,就是调用一下安装命令,我们只要在unity中给这个方法传过去文件的路径就可以了,其它自动更新逻辑完全可以在unity中写完了。下面我们来写一下添加步骤:

1、我们需要在我们的AndroidManifest.xml 标签中加入

<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

这个代码< manifest/>的子标签,不要加到< application/>中,这个权限是8.0必须的,不加这个权限,在7.0下是没问题的,然后我们解决7.0中的问题,7.0做了很大的变动,所以变动也比较大,我们还是先说文件中需要添加什么,我们要在< application> 标签中加入

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

在这里我们需要注意两个地方,

android:authorities="com.XXX.XXX.fileprovider" //这个值最好是你的包名,当然可以随便写,下面还会提到,需要和这个保持一致
android:resource="@xml/file_paths" //这个需要在你自己添加,需要在你的安卓项目目录结构中res文件夹下面创建xml文件,并创建file_paths.xml 
file_paths.xml文件中的内容为:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="" name="updateversion_apkfile" />
    </paths>
</resources>

2、下面就是在安卓项目中添加的java代码

	public void install(String dir, String apkName) {
		Uri uri = null;
		File file = new File(dir, apkName);
		Intent intent = new Intent(Intent.ACTION_VIEW);
		if(Build.VERSION.SDK_INT >= 24){
//			try{ //这种方式直接可以适配到7.0,8.0的不会报错,但是安装不成功
//				Method m = StrictMode.class.getMethod("disableDeathOnFileUriExposure");
//				m.invoke(null);
//			}catch(Exception e){
//				e.printStackTrace();
//			}
			uri = FileProvider.getUriForFile(getCurrentContext(), "com.XXX.XXX.fileprovider", file); //这个里面第二个参数就是上面提到的,需要和AndroidManifest文件中配置的要一直,不然会报错,其实这个是安卓做的一个安全机制,用这个名字代替你要访问的真是路径,大家可以打log看一下
		} else {
			uri = Uri.fromFile(file);
		}
		intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
		intent.setDataAndType(uri, "application/vnd.android.package-archive");
		startActivity(intent);
	}
	
	public static Context getCurrentContext() {
		if (mContext == null) {
			mContext = UnityPlayer.currentActivity.getApplicationContext();
		}
		return mContext;
	}

这里我只贴出了部分代码,其它的都和你普通安卓项目一样,为了大家方便,我可以给大家打好jar包,上传到我的csdn资源上去。到现在安卓项目写完了,大家可以打jar包放到你的unity项目中,并配置你unity项目中的AndroidManifest.xml文件和你res/xml/file_paths.xml文件。下面我给大家贴出我安卓项目中的目录结构图:

这里写图片描述

好了,到这里一般做unity的开发人员应该都没有问题,但是有的人可能会闲麻烦,直接就想要一个jar包,然后在unity项目里面直接调用就可以了,为了方便这些人,我这里给出相关jar包和相关配置,现在给大家做一个使用步骤:
1、修改AndroidManifest.xml 文件,按照上面的修改,将android:authorities="com.XXX.XXX.fileprovider"
改为android:authorities="com.autoinstall.fileprovider" jar包里面调用的也是这个,添加file_paths.xml文件到res/xml中,没有文件的自己创建即可。文件下载路径为:所需资源jar包
2、下面是unity中调用jar包中install方法的代码说明:

AndroidJavaObject _ajo;
 _ajo = new AndroidJavaClass("com.supergenius.sudokuapp.UpdateVersionActivity").CallStatic<AndroidJavaObject>(
                    "GetInstance");
 _ajo.Call("install", dir, filename);//我们在untiy中这样调用就可以了,第一个参数dir,是你保存apk文件的文件夹路径,filename是你apk文件的名字
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值