2012-02-21 4 views
1

현재 다른 몇 가지 응용 프로그램에 포함되어야하는 libproject (Android)를 개발 중입니다.Android C2DM 및 lib 프로젝트

C2DM 비트를 제외하고 Activity 및 Manifests로 조금 어려움을 겪었으므로 모든 것이 잘 작동합니다.

내가 잘 내 다른 클래스를 호출 할 수 있습니다,하지만 난 등록 ID를 잡을 수없는 것 (또는 물론 실제 메시지,하지만 그 같은 문제가 있어야합니다 ...)

나는 문제가 생각 내 매니페스트 (들)에서 필터링에서 오는 경우, 누군가가 내게 조언을하면 정말 도움이 될 것입니다.

내 매니페스트의 리시버 부분 사본입니다 (라이브러리가 아니라 앱에서 가져온 것입니다. 실제로는 사본입니다).하지만 꽤 엄격합니다. 난 그냥 ... 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> 

com.myapp.lib 내 lib에 패키지 이름이며, 수신기라는 이름의 패키지에 같은 (물론 lib 프로젝트에서).

도움에 미리 감사드립니다, 그리고 진행되면서 여러 가지 정보를 요청 주저하지 말고이

편집 :) : 나는 응용 프로그램과 LIB 모두 또한 구글 C2DM에 등록 만 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