Unity中关于多种安卓插件冲突问题的解决方法
2015-02-09 10:44
441 查看
项目制作过程中,我们往往会引入一些SDK来实现Unity引擎本身无法实现的功能,在关于安卓这方面,我们都知道安卓包中都有一个叫AndroidManifest.xml的配置文件,当我们引入2个或者多个安卓插件后就会存在插件之间的冲突问题,Unity会自动将它们合并成一个配置文件,可能会导致其中的一个或者多个插件无法正常发挥,甚至会使得工程崩溃。下面我以一个例子来阐述一下我是怎么解决这个插件冲突的问题。
在一个AR的项目中,我们需要用到高通的SDK用来扫描,以及ShareSDk用来一键分享我截下来的图片。
实践过,当我两个插件不经过处理的话,两个功能都无法正常得运行。我们可以看一下它们的两个配置文件,每个文件都有一个包名
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qualcomm.QCARUnityPlayer" android:versionCode="1" android:versionName="1.0">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.sharesdk.onekeyshare" android:versionCode="1" android:versionName="1.0" >
其次就是下面的实际逻辑application中的activity。
我的思路是这样的,首先得将它们的包名统一,然后将它们的实际逻辑都写在一个application去。包名统一很简单,我们可以都设置为Unity工程的包名,然后在该工程中依次单独导入SDK插件包,每导入一个插件,就将工程export得到一个安卓工程,可以看到其中含有一个AndroidManifest配置文件,包名就是Unity工程的包名,同样的删除插件,导入另外一个插件,同样的方法,可以拿到同样包名的另外一个配置文件,只是其中的实际逻辑不同。
现在要做的就是以其中一个配置文件为父体,将另外一个配置文件的实际逻辑内容加到其中去,也就是把其中的meta内容加到另外一个里面去,这样就实现了配置文件的统一。
下面就是高通SDK安卓的配置文件,ShareSDK安卓插件的配置文件,以及合并之后的配置文件,大家可以对比一下:
高通SDK:
ShareSDK:
合并之后的:
真机测试过,两个功能都是可以正常运行的。当然这也只是我的个人方法。
大体执行流程就是这样的,有什么错误或者建议的地方,欢迎大家指正,谢谢!!!
在一个AR的项目中,我们需要用到高通的SDK用来扫描,以及ShareSDk用来一键分享我截下来的图片。
实践过,当我两个插件不经过处理的话,两个功能都无法正常得运行。我们可以看一下它们的两个配置文件,每个文件都有一个包名
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qualcomm.QCARUnityPlayer" android:versionCode="1" android:versionName="1.0">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.sharesdk.onekeyshare" android:versionCode="1" android:versionName="1.0" >
其次就是下面的实际逻辑application中的activity。
我的思路是这样的,首先得将它们的包名统一,然后将它们的实际逻辑都写在一个application去。包名统一很简单,我们可以都设置为Unity工程的包名,然后在该工程中依次单独导入SDK插件包,每导入一个插件,就将工程export得到一个安卓工程,可以看到其中含有一个AndroidManifest配置文件,包名就是Unity工程的包名,同样的删除插件,导入另外一个插件,同样的方法,可以拿到同样包名的另外一个配置文件,只是其中的实际逻辑不同。
现在要做的就是以其中一个配置文件为父体,将另外一个配置文件的实际逻辑内容加到其中去,也就是把其中的meta内容加到另外一个里面去,这样就实现了配置文件的统一。
下面就是高通SDK安卓的配置文件,ShareSDK安卓插件的配置文件,以及合并之后的配置文件,大家可以对比一下:
高通SDK:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.qualcomm.QCARUnityPlayer" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <uses-feature android:name="android.hardware.camera" /> <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:anyDensity="true" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:debuggable="false"> <activity android:name="com.qualcomm.QCARUnityPlayer.QCARPlayerNativeActivity" android:label="@string/app_name" android:screenOrientation="landscape" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> <meta-data android:name="android.app.lib_name" android:value="unity" /> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name="com.unity3d.player.VideoPlayer" android:label="@string/app_name" android:screenOrientation="landscape" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> </activity> </application> </manifest> <!-- android:installLocation="preferExternal" -->
ShareSDK:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.sharesdk.onekeyshare" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/> <uses-permission android:name="android.permission.GET_ACCOUNTS"/> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:label="ShareSDK_U3D" android:name="cn.sharesdk.unity3d.ShareSDKApplication"> <activity android:name="cn.sharesdk.unity3d.demo.MainActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:windowSoftInputMode="adjustPan|stateHidden" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!-- KakaoTalk , 分享应用的时候,可以设置打开应用的参数 excuteUrl, 用户点击分享的内容时,就会打开相应的应用, 如果应用不存在,可以设置 installURL参数, 打开下载应用的相关网址 (executeUrl) 设置后intent-filter 后,分享时,需要设置参数 setExecuteUrl("kakaoTalkTest://starActivity"); --> <intent-filter> <data android:scheme="kakaoTalkTest" android:host="starActivity"/> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="cn.sharesdk.framework.ShareSDKUIShell" android:configChanges="keyboardHidden|orientation|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="stateHidden|adjustResize" /> <!-- 微信分享回调 --> <activity android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" /> <!-- 易信分享回调 --> <activity android:name=".yxapi.YXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:excludeFromRecents="true" android:exported="true" android:launchMode="singleTop" /> </application> </manifest>
合并之后的:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.data.AR" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal"> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <uses-feature android:name="android.hardware.camera" /> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <application android:allowBackup="true" android:label="Lol_AR" android:name="cn.sharesdk.unity3d.ShareSDKApplication" android:debuggable="false"> <activity android:name="cn.sharesdk.framework.ShareSDKUIShell" android:configChanges="keyboardHidden|orientation|screenSize" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:windowSoftInputMode="stateHidden|adjustResize" /> <!-- 微信分享回调 --> <activity android:name=".wxapi.WXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" /> <!-- 易信分享回调 --> <activity android:name=".yxapi.YXEntryActivity" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:configChanges="keyboardHidden|orientation|screenSize" android:excludeFromRecents="true" android:exported="true" android:launchMode="singleTop" /> <activity android:name="com.qualcomm.QCARUnityPlayer.QCARPlayerNativeActivity" android:label="@string/app_name" android:screenOrientation="portrait" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <data android:scheme="kakaoTalkTest" android:host="starActivity" /> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity> <activity android:name="com.unity3d.player.VideoPlayer" android:label="@string/app_name" android:screenOrientation="portrait" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"> </activity> </application> <uses-feature android:glEsVersion="0x00020000" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.autofocus" android:required="false" /> <uses-feature android:name="android.hardware.camera.front" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen" /> <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" /> <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> </manifest>
真机测试过,两个功能都是可以正常运行的。当然这也只是我的个人方法。
大体执行流程就是这样的,有什么错误或者建议的地方,欢迎大家指正,谢谢!!!
相关文章推荐
- 关于iOS页面中scrollview中嵌入百度地图滑动冲突问题解决方法
- 关于CINEMA 4D与QQ冲突,出现鼠标操作混乱问题的解决方法!
- 关于多人共用一宽带账号上网网卡地址冲突问题解决方法
- 安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
- 安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
- 关于安卓图片剪切造成软件崩溃问题的解决方法
- [Unity]关于iOS申请因为Advertising Identifier问题被拒绝的解决方法
- 解决多种插件冲突问题
- 关于DrCom上网客户端与Apache冲突的问题解决方法(更新)
- 关于Discuz与jQuery冲突问题的亲测解决方法
- Unity 中关于中文乱码以及压缩解压遇到的问题解决方法
- Unity接入安卓后图标和命名冲突的解决方法
- 关于安卓图库更新的问题终极解决方法(实测)
- 安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法
- 关于 JS 拖拽功能的冲突问题及解决方法
- 解决jquery在多插件中$冲突问题---jQuery.noConflict()方法
- 关于Jquery的noConflict()方法,解决Jquery库与其他库冲突问题
- 关于DIV被SELECT遮挡问题的解决方法
- 关于SQL的几个问题的解决方法
- 关于IE出现问题的解决方法