Partager les services et les autorisations du Manifeste du projet de bibliothèque

Je veux développer un projet de bibliothèque qui consiste en un GCMIntentService et qui effectue un processus d'enregistrement GCM et reçoit des messages envoyés sur GCM.

J'ai utilisé AIDL pour exposer mon service de projet de bibliothèque à l'application hôte, mais je dois aussi déclarer le service dans le projet d'application..... Comment puis-je éviter cela?
Aussi, j'avais besoin de déclarer toutes les autorisations requises pour GCM dans le manifeste d'application aussi.
Y a-t-il un moyen dans lequel toutes les autorisations et les services de le projet de bibliothèque peut être référencé à partir de l'application hôte sans avoir à les déclarer à nouveau dans le manifeste?

J'ai cherché sur cela et trouvé:
1. est - il possible d'encapsuler l'autorisation dans le cadre Android (bibliothèque)
Ce qui dit clairement que ce que j'essaie de réaliser n'est pas possible.
2. Quelque chose d'utile projet de bibliothèque le fichier manifeste fusionne-t-il? La réponse de @ Hayes Haugen dit que " AndroidManifest.la fusion xml est prise en charge dans la version 20 des outils ADT "
J'utilise la version ADT 20.0.3

Y a-t-il de toute façon que je puisse avoir un projet de bibliothèque fournissant une intégration GCM?

22
demandé sur Community 2013-01-31 12:38:44

5 réponses

Quelle erreur obtenez-vous?

Cela fonctionne très bien pour moi:

Manifeste De Bibliothèque

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="org.plasync.client.android"
          android:versionCode="1"
          android:versionName="1.0">
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.INTERNET" />
    <!-- Needed for devices with 4.02 or earlier android -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <permission android:name="org.plasync.client.android.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="org.plasync.client.android.permission.C2D_MESSAGE" />
   <!-- <uses-permission android:name="com.playsnc.client.android.data.permission.READ_WRITE"/>-->

    <application android:label="" android:icon="@drawable/ic_launcher">
        <!-- This is the signin activity for plAsync -->
        <activity android:name="org.plasync.client.android.AsyncMultiplayerSetupActivity"
                  android:label="@string/SETUP_ACTIVITY_NAME"
                  android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">

            <!-- This is the intent for getting the local user.  Apps that use plAsync must use this
                 intent to retrieve the local user, or allow the user to signin.  Apps should
                 use startActivityForResult as the sigin activity may require user interaction -->
            <intent-filter>
                <action android:name="@string/SETUP_ASYNC_MULTIPLAYER_SESSION_ACTION"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

        <receiver android:name="org.plasync.client.android.gcm.GcmBroadcastReceiver"
                  android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
            </intent-filter>
        </receiver>

        <service android:name="org.plasync.client.android.gcm.GcmReceiveIntentLauncher"/>
    </application>
</manifest>

Manifeste D'Application

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.plasync.client.android.testapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        <activity
            android:name="org.plasync.client.android.testapp.AsyncMultiplayerTestAppActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

        <activity android:name=".search.FriendSearchActivity"
                  android:launchMode="singleTop">
            <intent-filter>
                <action android:name="android.intent.action.SEARCH" />
            </intent-filter>
            <meta-data android:name="android.app.searchable"
                android:resource="@xml/searchable"/>
        </activity>

        <service android:name=".AsyncMultiplayerTestAppMessageReceiver"/>
    </application>

</manifest>

Aussi, je me demande si votre solution avec les services et AIDL est exagérée. J'ai commencé dans cette voie, mais j'ai été désactivé par la complexité de la communication interprocess pour ma situation. J'ai été en mesure de définir simplement un récepteur de diffusion et un service d'intention dans ma bibliothèque, qui lance un service d'intention dans mon application. Vous avez juste à être attention aux noms de paquets. et les noms des composants. Le nom du package sera toujours le nom du package de votre application, mais le nom du composant sera le nom de la classe à votre service.

1
répondu museofwater 2013-10-16 17:49:05

J'espère que cela aide, j'ai eu un problème similaire à vous et n'a pas pu trouver une solution qui n'a pas causé un problème ou un autre. Ma solution était quand quelqu'un utilise mon constructeur d'application, il dépose ma bibliothèque dans l'application ainsi que ma copie de la classe GCMintent et du fichier CGM lib.

Le système ajoute ensuite automatiquement les autorisations au manifeste de son application et affiche un nouvel apk à utiliser. C'est juste comment nous le faisons, j'espère que cela pourrait vous tendre dans le sens d'un solution.

1
répondu David 2013-02-01 09:29:57

Jetez un oeil à la solution D'UrbanAirship à ce problème particulier.

Documentation Android UrbanAirship

, Spécialement la partie Configuring your Client Application

1
répondu yyouf 2013-10-06 07:57:08

Afaik le manifeste de la Bibliothèque est complètement ignoré lors de la compilation

0
répondu NikkyD 2013-12-07 21:47:10

Pour la partie merge, j'ai eu le même problème de devoir déclarer à nouveau mon service à partir d'un projet lib dans le Manifeste du projet principal.

Pour ceux qui manifestmerger ne fonctionne pas avec Eclipse (pour rappel, l'idée est de mettre la ligne suivante dans project.properties):

manifestmerger.enabled=true

... vous devrez peut-être alors nettoyer le projet principal pour que cela fonctionne... (menu Projet, Propre...)

Cela semble stupide, mais depuis que j'ai eu du mal à trouver pourquoi Modifier project.properties ne fonctionnait pas, d'autres ont peut-être eu le même problème.

, Vous pouvez vérifier si la fusion a été fait correctement en vérifiant le fichier bin/AndroidManifest.xml.

0
répondu Vincent Hiribarren 2014-04-11 16:24:48