22

GCMIntentServiceで構成され、GCM登録プロセスを実行し、GCMを介して送信されたメッセージを受信するライブラリプロジェクトを開発したいと思います。

AIDLを使用してライブラリプロジェクトサービスをホストアプリケーションに公開しましたが、アプリケーションプロジェクトでもサービスを宣言する必要があります.....これを回避するにはどうすればよいですか?
また、アプリケーションマニフェストでもGCMに必要なすべてのアクセス許可を宣言する必要がありました。
ライブラリプロジェクトのすべてのアクセス許可とサービスを、マニフェストで再度宣言しなくても、ホストアプリケーションから参照できる方法はありますか?

私はこれを検索して見つけました:
1。Androidフレームワーク(ライブラリ)内にパーミッションをカプセル化することは可能
ですか?これは、私が達成しようとしていることは不可能であることを明確に示しています。
2.マニフェストファイルがマージされる有用なライブラリプロジェクトはありますか? @Hayes Haugenの回答によると、「AndroidManifest.xmlのマージはADTツールのバージョン20でサポートされています」
私は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

これがお役に立てば幸いです。私はあなたと同じような問題を抱えていて、何らかの問題を引き起こさない解決策を見つけることができませんでした。私の解決策は、誰かが私のアプリケーションビルダーを使用すると、私のライブラリと、GCMintentクラスおよびCGMlibファイルのコピーをアプリケーションにドロップすることでした。

次に、システムは自動的に彼のアプリのマニフェストに権限を追加し、彼が使用するための新しいapkをポップします。これが私たちのやり方です。これが解決策の方向にあなたを導くかもしれないことを願っています。

于 2013-02-01T09:29:57.977 に答える
1

その特定の問題に対するUrbanAirshipのソリューションを見てください。

UrbanAirshipAndroidドキュメント

特に一部Configuring your Client Application

于 2013-10-06T07:57:08.127 に答える
0

afaikコンパイル時にライブラリのマニフェストは完全に無視されます

于 2013-12-07T21:47:10.640 に答える
0

マージ部分については、メインプロジェクトのマニフェストでlibプロジェクトからサービスを再度宣言する必要があるという同じ問題がありました。

Eclipsemanifestmergerを使用していない人のために(念のため、次の行をに入れることをお勧めします):project.properties

manifestmerger.enabled=true

...次に、メインプロジェクトをクリーンアップして機能させる必要がある場合があります...(メニュー[プロジェクト] 、 [クリーンアップ...] )

ばかげているように聞こえますが、変更が機能しない理由を見つけるのに苦労したのでproject.properties、他の人も同じ問題を抱えていた可能性があります。

ファイルをチェックすることで、マージが正しく行われたかどうかを確認できますbin/AndroidManifest.xml

于 2014-04-11T16:24:48.980 に答える