android - funciones - objetivos de una biblioteca publica
Compartir los servicios y permisos de manifiesto del proyecto de la biblioteca. (5)
Quiero desarrollar un proyecto de biblioteca que consiste en un GCMIntentService y realiza el proceso de registro de GCM y recibe mensajes enviados a través de GCM.
He usado AIDL para exponer el servicio de proyecto de mi biblioteca a la aplicación host, pero también debo declarar el servicio en el proyecto de aplicación ... ¿Cómo puedo evitar esto?
También necesitaba declarar todos los permisos requeridos para GCM en el manifiesto de aplicación también.
¿Hay alguna forma en que se pueda hacer referencia a todos los permisos y servicios del proyecto de biblioteca desde la aplicación host sin tener que declararlos nuevamente en el manifiesto?
He buscado sobre esto y encontrado:
1. ¿Es posible encapsular permisos dentro del marco de Android (biblioteca)?
Lo que claramente dice que lo que estoy tratando de lograr no es posible.
2. Algo útil Proyecto de biblioteca ¿se fusiona el archivo de manifiesto? La respuesta de @Hayes Haugen dice que "la fusión de AndroidManifest.xml se admite en la versión 20 de las herramientas de ADT"
Estoy usando ADT versión 20.0.3
¿Hay alguna forma de lograr un proyecto de biblioteca que proporcione la integración de GCM?
¿Qué error estás recibiendo?
Esto está funcionando muy bien para mí:
Manifiesto de la biblioteca
<?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>
Manifiesto de aplicación
<?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>
Además, me pregunto si su solución con servicios y AIDL es una exageración. Comencé por ese camino, pero me desanimé por la complejidad de la comunicación entre procesos para mi situación. He podido definir simplemente un receptor de difusión y un servicio intencional en mi biblioteca, que lanza un servicio intencional en mi aplicación. Solo tienes que tener cuidado con los nombres de los paquetes. y nombres de componentes. El nombre del paquete siempre será el nombre del paquete para su aplicación, pero el nombre del componente será el nombre de la clase para su servicio.
Eche un vistazo a la solución de UrbanAirship para ese problema en particular.
Documentación de UrbanAirship para Android
Especialmente la parte Configuring your Client Application
Espero que esto ayude, tuve un problema similar al tuyo y no pude encontrar una solución que no causara algún problema. Mi solución fue que cuando alguien usa mi generador de aplicaciones, coloca mi biblioteca en la aplicación, así como mi copia de la clase GCMintent y el archivo lib de CGM.
El sistema luego agrega automáticamente los permisos al manifiesto de su aplicación y saca una nueva apk para su uso. Así es como lo hacemos, espero que esto pueda ayudarlo a encontrar una solución.
Para la parte de fusión, tuve el mismo problema de tener que declarar mi servicio de un proyecto lib en el manifiesto del proyecto principal de nuevo.
Para aquellos en los que manifestmerger
no está trabajando con Eclipse (como recordatorio, la idea es poner la siguiente línea en project.properties
):
manifestmerger.enabled=true
... es posible que deba limpiar el proyecto principal para que funcione ... (menú Proyecto , Limpiar ... )
Suena estúpido, pero como tuve problemas para encontrar el motivo por el que modificar project.properties
no funcionaba, es posible que otros hayan tenido el mismo problema.
Puede verificar si la combinación se realizó correctamente al revisar el archivo bin/AndroidManifest.xml
.
afaik el manifiesto de la biblioteca se ignora por completo al compilar