2012-02-21 10 views
1

私は現在、いくつかの他のアプリケーションに含まれるべきlibproject(Android)を開発中です。Android C2DMとlibプロジェクト

私はC2DMビットのために実行されたアクティビティとマニフェストで少し苦労しています。

私は罰金私の異なるクラスを呼び出すことができますが、私は、登録IDをキャッチすることができないよう(または、もちろん実際のメッセージが、それは同じ問題でなければなりません...)

私は問題があると思います誰かが私のためにアドバイスを持っているなら、私のマニフェストのフィルタリングから来て、それは本当に役立つでしょう。

私のマニフェストのレシーバー部分のコピーです(ライブラリではなくアプリからですが、実際はコピーです)。しかし、それはかなり厳しいです。私はちょうどcom.myapp.libが私のlibパッケージ名で、受信機は、名前のパッケージにある

 <!-- 
      Only C2DM servers can send messages for the app. If permission is 
      not set - any other app can generate it 
     --> 
     <receiver 
      android:name="com.google.android.c2dm.C2DMBroadcastReceiver" 
      android:permission="com.google.android.c2dm.permission.SEND" > 

      <!-- Receive the actual message --> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
       <category android:name="com.myapp.lib" /> 
      </intent-filter> 
      <!-- Receive the registration id --> 
      <intent-filter> 
       <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 
       <category android:name="com.myapp.lib" /> 
      </intent-filter> 
     </receiver> 

...私はlibに右のクラスを呼び出すためにそれを適応させる必要がある方法を知りたいです同じもの(libプロジェクトではもちろん)。

助けを事前に感謝、と詳細をfurthersを求めることを躊躇しないでください:)

編集: 私はGoogleのC2DMに登録のみのlibと試みたが、またアプリとlibの両方を持ちます。同じ問題

答えて

2

行きます。

マニフェストファイルは、アプリケーションからのものです。 libのパッケージはcom.mylibで、appのパッケージはcom.myappです。

libマニフェストには2つの変更点があります。

  1. 権限で使用されるクラスパス。
  2. インテントフィルターパッケージ。

どちらもアプリパッケージであり、あなたのlibパッケージではありません。

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

<permission android:name="com.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 

<uses-permission android:name="com.myapp.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" > 

    <uses-library android:name="com.google.android.maps" android:required="true"/> 



    <activity 
     android:name=".MyActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 


    <receiver 
     android:name="com.mylib.C2DMRegistrationReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" > 
      </action> 
      <category android:name="com.myapp" /> 
     </intent-filter> 
    </receiver> 

    <receiver 
     android:name="com.mylib.C2DMMessageReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" > 
      </action> 
      <category android:name="com.myapp" /> 
     </intent-filter> 
    </receiver> 
</application> 
</manifest> 
0

マニフェストは正常です。パッケージにC2DMReceiverというクラスがあり、C2DMBaseReceiverを拡張する必要があります。このクラスとそれに含まれるオーバーライドされたメソッドは、正常な登録時およびメッセージの受信時に呼び出されます。私はあなたがhere

+0

回答者に感謝します。私はすでにそれを行いました。アプリケーションとしてライブラリを使用するとうまくいきます。私はC2DMを新しいパッケージにコピーすることなく、ライブラリを使用してプロジェクトでこれらのクラスを使用したいと思います。それを動作させる方法を見つけることができません。 – Ours

1

回答を参照するために役立つかもしれない本の非常に基本的な例を書かれている、google.android.c2dmパッケージで

、クラスC2DMBaseReceiver ...誰もが同じ問題でつまずきます、この方法runIntentInServiceは..完全修飾名で

String receiver = context.getPackageName() + ".C2DMReceiver" 

を変更し、そこには、インテントフィルタを使用してライブラリプロジェクトからあなたC2DMを使用しての良い方法があります:)

+0

ライブラリを使用するすべてのアプリにgoogle.android.c2dmパッケージを入れますか?またはあなたはそれを何と置き換えたのですか? – johan