22

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

我已经使用 AIDL 将我的库项目服务公开给宿主应用程序,但我还需要在应用程序项目中声明该服务.....我该如何避免这种情况?
此外,我还需要在应用程序清单中声明 GCM 所需的所有权限。
有什么方法可以从宿主应用程序中引用库项目中的所有权限和服务,而无需在清单中再次声明它们?

我对此进行了搜索,发现:
1.是否可以在Android框架(库)中封装权限,
这清楚地表明我想要实现的目标是不可能的。
2. 清单文件合并了一些有用的库项目吗? @Hayes Haugen 的回答说“ADT 工具的版本 20 支持 AndroidManifest.xml 合并”
我使用的是 ADT 版本 20.0.3

无论如何我可以实现提供 GCM 集成的库项目吗?

4

5 回答 5

2

你遇到了什么错误?

这对我很有用:

图书馆清单

<?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 的解决方案是否过大。我从那条路线开始,但由于我的情况下进程间通信的复杂性而被关闭。我已经能够在我的库中简单地定义一个广播接收器和意图服务,在我的应用程序中启动一个意图服务。你只需要小心包名。和组件名称。包名称将始终是您的应用程序的包名称,但组件名称将是您的服务的类名称。

于 2013-10-16T17:49:05.293 回答
1

看看 UrbanAirship 对这个特定问题的解决方案。

UrbanAirship Android 文档

特别是部分Configuring your Client Application

于 2013-10-06T07:57:08.127 回答
1

我希望这会有所帮助,我遇到了与您类似的问题,并且找不到不会导致某些或其他问题的解决方案。我的解决方案是当有人使用我的应用程序构建器时,它会将我的库以及我的 GCMintent 类和 CGM 库文件的副本放入应用程序中。

然后系统会自动将权限添加到他的应用程序清单中,并弹出一个新的 apk 供他使用。这就是我们的做法,我希望这可能会使您朝着解决方案的方向前进。

于 2013-02-01T09:29:57.977 回答
0

afaik 库的清单在编译时被完全忽略

于 2013-12-07T21:47:10.640 回答
0

对于合并部分,我遇到了同样的问题,即必须再次从主项目清单中的 lib 项目声明我的服务。

对于那些manifestmerger不使用Eclipse的人(提醒一下,我们的想法是将以下行放入project.properties):

manifestmerger.enabled=true

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

这听起来很愚蠢,但由于我无法找到修改project.properties不起作用的原因,其他人可能也遇到了同样的问题。

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

于 2014-04-11T16:24:48.980 回答