2013-09-09 7 views
15

Also versuche ich, Gradle zu verwenden, um einen separaten BuildType zu erstellen, aber dieser BuildType muss verschiedene Eigenschaften für den verwenden gleiche Aktivität. In diesem Fall benötigt meine Splash-Aktivität je nach BuildType einen anderen Intent-Filter. Ist das möglich?Gradle: Wie Android Manifest Dateien für verschiedene BuildTypes zusammenführen, die die gleiche Aktivität benötigen, aber mit verschiedenen Intent-Filtern

bekomme ich folgende Fehler in gradle:

:Tinder:processUtestManifest 
[AndroidManifest.xml:67, AndroidManifest.xml:38] Trying to merge incompatible /manifest/application/activity[@name=com.<company_name>.activities.ActivitySplash] element: 
    <activity 
     @android:name="com.<company_name>.activities.ActivitySplash" 
     <intent-filter> 
      <action 
--   @android:name="android.intent.action.MAIN"> 
    <activity 
     @android:name="com.<company_name>.activities.ActivitySplash" 
     <intent-filter> 
      <action 
++   @android:name="com.apphance.android.LAUNCH"> 

Antwort

11

Es ist nicht möglich, die Intent-Filter separat im Moment zu fusionieren, so würde ich empfehlen, die ganzen <activity> Knoten in

src/buildtype1/AndroidManifest.xml 

Kopieren und

src/buildtype2/AndroidManifest.xml 

und es wird automatisch zusammengeführt in das endgültige Manifest (natürlich möchten Sie es auch aus dem Hauptmanifest entfernen).

+0

Dank Xav, wenn ich thi s Modell und versuche, in Android Studio zu bauen, bekomme ich: "Android Packager: [] java.util.zip.ZipException: doppelten Eintrag: AndroidManifest.xml" Irgendwelche Ideen? –

+0

passen Sie die Quellsätze an? Dies sollte nicht passieren, wenn Sie dies nicht tun, und wenn Sie dies getan haben, müssen Sie den Pfad, den ich erwähnt habe, Ihrer tatsächlichen Struktur anpassen. –

+0

Danke Xav, ich habe versucht, mein Projekt so einzurichten, wie du es vorschlägst, aber dieses Setup hat anscheinend ein weiteres Problem mit Android Annotations verursacht, so dass ich nicht feststellen kann, ob das mein Merging Problem behebt. Das andere Problem ist unter http://stackoverflow.com/questions/18833642/gradle-android-annotations-merged-manifest-could-not-find-the-androidmani. Wenn es dir nichts ausmacht, einen Blick darauf zu werfen, würde ich es sehr schätzen! –

4

Ändern der AndroidManifest im raubend app/lib aus:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
... 
<activity android:name="com.<company_name>.activities.ActivitySplash"> 

An:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 
... 
<activity android:name="com.<company_name>.activities.ActivitySplash" 
    tools:merge="override"> 
+0

Diese Methode hat für mich gearbeitet. Alles, was Sie brauchen, ist Tools hinzufügen: merge = "override" im Kind (übersteuert) AndroidManifes.xml –

+0

Ich bekomme immer noch "Versuch zu inkompatiblen" nach dem Hinzufügen dieser :( – slott

+0

Diese Lösung bittrotted. Siehe eine Arbeit hier http: //stackoverflow.com/questions/21239844/gradle-merge-wrapper-sub-modules-android-manifest-into-a-main-modules-manifest – Oded

5

Lassen Sie mich eine vollständige Lösung veröffentlichen, die funktioniert. In diesem Fall verwaltet die Anwendung Intent-Filter für Bilder und Videos. Für einen bestimmten Geschmack möchten wir jedoch nur Videos und keine Bilder erfassen.

Sagen Sie Ihre Aktivität wie folgt definiert ist:

<activity 
    android:name=".MainActivity" 
    android:configChanges="keyboardHidden|orientation|screenSize" 
    android:label="@string/app_name" 
    android:launchMode="singleTop" 
    android:screenOrientation="landscape" 
    android:theme="@style/CameraTheme"> 

    <intent-filter> 
     <action android:name="android.media.action.IMAGE_CAPTURE"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.media.action.VIDEO_CAPTURE"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

Für Ihren Geschmack myFlavor namens, dass ich Sie bereits an, Sie dies in Ihrer AndroidManifest.xml Datei haben müssen:

<!-- Remove the intent filter for images. MyFlavor is only for videos. --> 
<activity 
    android:name="com.androidsx.heliumvideochanger.MainActivity" 
    tools:node="merge"> 

    <intent-filter tools:node="remove"> 
     <action android:name="android.media.action.IMAGE_CAPTURE"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

Sync mit Gradle, und überprüfen Sie das endgültige Manifest, das ist in der Regel in myApp/build/intermediates/manifests/full/myFlavor/debug/AndroidManifest.xml