2015-10-16 42 views
1

我有一个困难时期试图从我的插件与统一的主要表现:(添加使用清单合并意图过滤器在Unity3d

合并清单的统一清单

<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name"> 
<intent-filter> 
<action android:name="android.intent.action.MAIN" /> 
<category android:name="android.intent.category.LAUNCHER" /> 
</intent-filter> 
<meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 
</activity> 

我的插件清单

<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <category android:name="android.intent.category.BROWSABLE"/> 
      <data android:scheme="XXX"/> 
      </action> 
    </intent-filter> 
</activity> 

我的目标是这个额外的意图过滤器添加到交流,但它具有

悲惨的失败了
Trying to merge incompatible /manifest/application/activity[@name=com.unity3d.player.UnityPlayerActivity 

添加工具:node =“merge”或tools:node =“replace”也没有帮助。

关于如何添加意图的任何线索? 谢谢 D

回答

0

您可以列出一个活动下的所有意向。所以,你的表现应该是这样的

<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="@string/app_name"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
    <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <category android:name="android.intent.category.BROWSABLE"/> 
      <data android:scheme="XXX"/> 
     </action> 
    </intent-filter> 
</activity> 
+0

是的,这是我想要最终得到的结果,但是我不能(手动)创建如清单:它需要是两个清单合并的输出(参见https://developer.android.com/tools/building/manifest-merge.html)。 – Delta

+0

如果您想合并思想代码,您应该将其编辑为'XDocument',这是一些插件(如Unibill)如何更新清单。 但我敢肯定,我主要是有时候改变了。您可以尝试下一步: 1.构建无插件游戏 2.在文件夹'/ Temp/StagingArea/AndroidManifest.xml'中生成统一生成的清单 3.添加您的插件权限,然后将其放到'Assets/Plugins/Android/AndroidManifest.xml' 这有点肮脏的解决方案,但它为我工作。 – B4lto

+0

了解。我希望避免必须通过代码进行合并,而是使用内置的合并机制。但是如果没有其他方法,我会手动解析清单。谢谢。 – Delta

0

您可以通过避免代码合成但你必须为你的意图过滤器,它只是调用com.unity3d.player.UnityPlayerActivity

我创建一个单独的活动只是COMMITED一个意图帮手utiliy我这一次创建: https://github.com/simon-heinen/aEx_unity/blob/master/aEx_IntentHelper/Plugins/Android/sources/IntentFilterActivity.java

public class IntentFilterActivity extends Activity { 

private static final String LOG_TAG = IntentFilterActivity.class 
     .getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    final String gameObjectName = "IntentFilter"; 
    final String methodName = "OnIntentFilter"; 
    final String messageToSend = getIntent().getData().toString(); 

    /* 
    * Get the main activity launch it and wait until the unity player is 
    * ready to receive the URL via UnityPlayer.UnitySendMessage() 
    */ 
    String myOwnPackageName = getApplicationContext().getPackageName(); 
    Intent mainLauncherIntent = getPackageManager() 
      .getLaunchIntentForPackage(myOwnPackageName); 
    startActivity(mainLauncherIntent); 

    new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... params) { 
      Log.d(LOG_TAG, "Will now wait until unity player is ready.."); 
      while (UnityPlayer.currentActivity == null) { 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      Log.d(LOG_TAG, "Unity is ready, sending event: " 
        + gameObjectName + "." + methodName + "(" 
        + messageToSend + ")"); 
      UnityPlayer.UnitySendMessage(gameObjectName, methodName, 
        messageToSend); 
     } 
    }.execute(); 

} 
} 

,也许你只是使用完整的https://github.com/simon-heinen/aEx_unity/tree/master/aEx_IntentHelper

我认为这种方式比将它整合到Unity活动本身更好,因为您可以在所有项目中重复使用它,而无需修改它;)