共享库项目的清单服务和权限

我想开发一个由GCMIntentService组成的库项目,它执行GCM注册过程并接收通过GCM发送的消息。

我用AIDL来暴露我的图书馆项目服务主机应用程序,但我需要在应用程序项目中声明服务也…..我怎样才能避免这种情况?
我也需要在应用程序清单中声明GCM所需的全部权限。
有什么办法可以从主机应用程序引用来自库项目的所有权限和服务,而不必在清单中再次声明它们?

我已经搜查了这一点,发现:
1. 在Android框架(库)中是否可以封装权限?
这清楚地表明,我试图达到的是不可能的。
2.有用的库项目清单文件合并? @Hayes Haugen的回答是,“ADT工具的版本20支持AndroidManifest.xml合并”
我正在使用ADT版本20.0.3

无论如何,我可以实现提供GCM集成的图书馆项目吗?

Solutions Collecting From Web of "共享库项目的清单服务和权限"

你遇到了什么错误?

这对我很好:

图书馆清单

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

应用程序清单

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

另外,我想知道如果你解决服务和AIDL是矫枉过正。 我开始了这条路线,但由于我的情况,进程间通信的复杂性被closures了。 我已经能够简单地在我的库中定义一个广播接收器和意图服务,在我的应用程序中启动一个intent服务。 你只需要小心包名称。 和组件名称。 包名称将始终是您的应用程序的包名称,但组件名称将是您的服务的类名称。

我希望这有帮助,我有一个类似的问题,找不到一个没有造成一些或其他问题的解决scheme。 我的解决scheme是当有人使用我的应用程序构build器时,它将我的库下载到应用程序以及GCMintent类和CGM lib文件的副本中。

然后系统自动将权限添加到他的应用程序清单,并popup一个新的apk给他使用。 这就是我们如何做到的,我希望这可能会让你朝着解决scheme的方向前进。

看看UrbanAirship解决这个问题的方法。

UrbanAirship Android文档

特别是Configuring your Client Application的部分

编译时完全忽略了图书馆的清单

对于合并部分,我有同样的问题不得不再次从主项目清单中的lib项目中声明我的服务。

对于那些manifestmerger不能使用Eclipse的人 (作为提醒,这个想法是把下面一行放在project.properties ):

manifestmerger.enabled=true

…然后,您可能需要清理主项目,以便它可以工作…(菜单项目清理…

这听起来很蠢,但是因为我很难find为什么修改project.properties不工作,其他人可能也有同样的问题。

您可以通过检查文件bin/AndroidManifest.xml来检查合并是否正确完成。