2013-09-09 5 views
15

, quindi sto provando a utilizzare gradle per creare un buildType separato, ma buildType deve utilizzare caratteristiche diverse per stessa attività. In questo caso, la mia attività di splash ha bisogno di un filtro di intent diverso a seconda di buildType. È possibile?Gradle: come unire i file manifest di Android per diversi buildTypes che richiedono la stessa attività, ma con diversi filtri di intent

ottengo il seguente errore nel 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"> 

risposta

11

Non è possibile unire l'intento filtro separatamente al momento quindi vi consiglio di copiare l'intero <activity> nodo in

src/buildtype1/AndroidManifest.xml 

e

src/buildtype2/AndroidManifest.xml 

ed otterrà automaticamente fuse nel manifest finale (ovviamente anche tu vuoi rimuoverlo dal manifest principale).

+0

Grazie Xav, quando uso thi s modello e provare a creare all'interno di Android Studio, ottengo: "Packager Android: [] java.util.zip.ZipException: duplicato voce: AndroidManifest.xml" Qualche idea? –

+0

stai personalizzando i sorgenti? questo non dovrebbe accadere se tu non lo facessi e se lo facessi, dovrai fare in modo che il percorso che ho menzionato corrisponda alla tua struttura attuale. –

+0

Grazie Xav, ho provato a configurare il mio progetto come suggerito, ma questa installazione ha apparentemente causato un altro problema con Annotazioni Android quindi non sono in grado di determinare se questo risolve il mio problema di unione. L'altro problema è disponibile all'indirizzo http://stackoverflow.com/questions/18833642/gradle-android-annotations-merged-manifest-could-not-find-the-androidmani. Se non ti dispiacerebbe dare un'occhiata, lo apprezzerei davvero! –

4

Modificare l'AndroidManifest nel consumo di app/lib da:

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

A:

<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

Questo metodo ha funzionato per me. Tutto ciò di cui hai bisogno è aggiungere strumenti: unione = "override" nel figlio (sovrascritto) AndroidManifes.xml –

+0

Ho ancora "Sto cercando di unire incompatibile" dopo aver aggiunto questo :( – slott

+0

Questa soluzione è bitrotted. //stackoverflow.com/questions/21239844/gradle-merge-wrapper-sub-modules-android-manifest-into-a-main-modules-manifest – Oded

5

Fammi postare una soluzione completa che funziona. In questo caso, l'applicazione gestisce i filtri intent per immagini e video. Tuttavia, per un particolare sapore, vogliamo solo catturare video, non immagini.

Dite la vostra attività è definita in questo modo:

<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> 

Per il vostro sapore di nome myFlavor, che si assume già, devi avere questo nel vostro AndroidManifest.xml del file:

<!-- 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> 

Sincronizza con Gradle e controlla il manifest finale, che di solito è in myApp/build/intermediates/manifests/full/myFlavor/debug/AndroidManifest.xml

Problemi correlati