一、开始之前
在unity打包的apk中,一般来说,调用Android方式,通过类似
obj = new AndroidJavaObject("android.content.Intent")
obj .Call<方法返回类型>("方法名", 参数);
这样的方式调用来实现一些简单的功能,但是当实现比较复杂的功能或者代码量比较多的时候就需要考虑使用jar包或者在unity中引用库。由于是在unity中引用,所以jar包和引用库的制作和集成和原生开发有少许不同:
1.1 制作jar包并使用
以在eclipse环境下制作为例:
- 首先在C:\Program Files\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes目录下拿到class.jar放入jar工程中
- 继承UnityPlayerActivity,如果重写onCreate方法去掉其中的setContentView()
- 编写自己的功能接口(继承了的好处就是在编写时候可以用UnityPlayer.currentActivity当作上下文,否则就用
UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity")
获取上下文) - 用Export导出Jar放入Unity 的 Assets/plugins/Android/下
- 在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工程结构目录添加
二、唤起安装界面
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);
}
三、最后
7.0以上的系统得配置contentProvider才可以,如果你还没有解决,可以尝试下下载最后的插件,在唤起处调用
AndroidJavaClass obj = new AndroidJavaClass("com.am1105.installapk.MainActivity");
obj.CallStatic<bool>("invokeAndroidInstallPage",
"apk文件的路径");
如APK在android手机根目录,那么调用的路径为:
/storage/emulated/0/xxx.apk
*******************************************************************************************************************************
解决出现两个图标问题
解决方法很简单,把原来的Mainfest.xml文件,这个
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
进行删除即可。