合并android清单文件,冲突过滤器

时间:2013-11-05 17:56:54

标签: android merge manifest

我正在尝试合并Unity中2个插件的android清单文件,但有两个活动使用相同的intent-filter,我只能同时使用1个或另一个....

在两个冲突的活动中,清单文件中最重要的一个是可行的。因此,如果清单#1中的活动位于顶部,插件#1将起作用,但不起作用#2,反之亦然。

两个相互冲突的活动是:

<activity
        android:name="com.devfo.andutils.DevfoUnityPlayerActivity"
        android:label="@string/app_name"
        android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
        android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </activity> 

<activity android:name="com.qualcomm.QCARUnityPlayer.QCARPlayerProxyActivity" 
android:label="@string/app_name" android:screenOrientation="portrait" 
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

有什么方法可以合并这两个并让他们从同一个应用程序工作?我正在使用Unity 3d。

5 个答案:

答案 0 :(得分:6)

例如,在您只想将第一个活动用作启动器的清单中,您必须添加以下两个修改:

在清单的开头:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">

对于要删除意图过滤器的活动,请添加以下代码:

<activity android:name="com.qualcomm.QCARUnityPlayer.QCARPlayerProxyActivity" 
android:label="@string/app_name" android:screenOrientation="portrait" 
android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen">
  <intent-filter tools:node="removeAll">
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

重要的是在intent-filter标记中添加 tools:node =“removeAll”属性

答案 1 :(得分:2)

声明你的清单标题如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

然后将以下适当的属性之一添加到相关的活动中:

tools:merge="override"
tools:merge="remove"

答案 2 :(得分:2)

与@amarkovits的答案略有不同,我发现成功了:

<activity android:name="com.qualcomm.QCARUnityPlayer.QCARPlayerProxyActivity"
          android:label="@string/app_name" android:screenOrientation="portrait"
          android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
          tools:node="merge">
            <intent-filter tools:node="remove"> ...

我相信它会首先尝试合并它,然后只替换在启动器屏幕上导致两个图标的intent过滤器

答案 3 :(得分:1)

拥有此Activity的{​​{1}}:

intent-filter

是将在应用程序启动时启动的主<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> ,您不能同时使两个活动同时工作。

你应该做的只是让一个活动(你的主要活动有这个过滤器)而离开另一活动。

第二个Activity也将成为应用程序的一部分,但它不会是您将看到的第一个Activity。您可以使用Activity方法启动它。

答案 4 :(得分:0)

我已经做到了,解决方案是,当您有多种口味时,例如 1. flavourA, 2. flavourB 并且主要应用程序ID为-com.android.vivek

和主要风味A正在使用com.android.vivek 第二个flavorB正在使用com.android.vivek.flavorb

flavorA的清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android.vivek">

<application xmlns:tools="http://schemas.android.com/tools"
    android:allowBackup="true"
    android:icon="@mipmap/flavorA_ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:replace="android:icon" />

    <activity
        android:name=".ActivitySplash"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        tools:node="replace">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

 </application>

然后像下面这样简单地调味flavorB的清单

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android.vivek">

<application xmlns:tools="http://schemas.android.com/tools"
    android:allowBackup="true"
    android:icon="@mipmap/flavorB_ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme"
    tools:replace="android:icon" />

    <activity
        android:name=".flavorB.SecondActivity"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:screenOrientation="portrait"
        tools:node="replace">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity
        android:name=".ActivitySplash"
        android:label="@string/app_name"
        android:launchMode="singleTop"
        android:screenOrientation="portrait">

        <intent-filter tools:node="remove">
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>

 </application>

当您运行flavorA或flavorB时,它将正常工作