Unity调用Android下载APK功能以及各种坑
前言
最近在做Unity实现Android更新,即在unity界面点击某个按钮后,跳转到指定apk的系统安装界面,实现更新和下载apk的功能。把此期间遇到的种种问题
一、首先实现unity和Android的通信
1.一切的功能建立在unity和Android可以互通信的情况下,案例网上大把的有,在此说几点,Android的工程的包名可以和unity打包的包名不一致。只要在mainfest文件里声明mainactivity的地方写对就可以了。
2.当可以建立后,才发现可以通过调用不同的AndroidJavaObject来实现对同Android里同module下其他包进行调用。新手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>
总结
以上就是今天要讲的内容,主要是记录下自己开发过程中遇到的坑,希望可以对遇到同样问题的小伙伴提供一些帮助,毕竟这两天,百度打开的网页至少有上百个了。-。-太难了。