2014-07-14 4 views
1

내 프로젝트의 라이트 버전으로 내보낼 라이브러리로 하나의 프로젝트가 있습니다. 도서관 프로젝트에서 푸시 알림을 구현했습니다. 라이브러리 프로젝트를 일반 프로젝트로 실행했고 푸시 알림이 제대로 작동합니다. 라이트 프로젝트에서 라이브러리로이 프로젝트를 가져올 때 내 문제가 발생합니다. 푸시 알림이 실패했습니다. 라이브러리 프로젝트의 Manifest.xml도서관 프로젝트에 푸시 알림 받기

public class GCMIntentService extends GCMBaseIntentService { 
    public static final String SENDER_ID = "206703456431"; 

    public GCMIntentService() { 
     super(SENDER_ID); 
    } 

    private static final String TAG = "===GCMIntentService==="; 

    @Override 
    protected void onRegistered(Context arg0, String registrationId) { 
     Log.i(TAG, "Device registered: regId = " + registrationId); 
     Applications app = (Applications) getApplication(); 
     app.setDeviceToken(registrationId); 
    } 

    @Override 
    protected void onUnregistered(Context arg0, String arg1) { 
     Log.i(TAG, "unregistered = " + arg1); 
    } 

    @Override 
    protected void onMessage(Context arg0, Intent arg1) { 
     Log.i(TAG, "Received message. Extras: " + arg1.getExtras()); 
     String message = arg1.getExtras().getString("message"); 
     displayMessage(arg0, message); 
     // notifies user 
     generateNotification(arg0, message); 


    } 

    @Override 
    protected void onError(Context arg0, String errorId) { 
     Log.i(TAG, "Received error: " + errorId); 
    } 

    @Override 
    protected boolean onRecoverableError(Context context, String errorId) { 
     return super.onRecoverableError(context, errorId); 
    } 

    /** 
    * Issues a notification to inform the user that server has sent a message. 
    */ 
    @SuppressWarnings("deprecation") 
    private static void generateNotification(Context context, String message) { 
     int icon = R.drawable.icon_57x57_fixed; 
     NotificationManager notificationManager = (NotificationManager) context 
       .getSystemService(Context.NOTIFICATION_SERVICE); 
     Notification notification = new Notification(); 
     notification.defaults |= Notification.DEFAULT_SOUND; 
     notification.icon = icon; 
     String title = context.getString(R.string.app_name); 
     Intent notificationIntent = new Intent(context, 
       HomeScreenActivity.class); 
     Intent notificationIntentV2 = new Intent(context, 
       LoginActivity.class); 
     // set intent so it does not start a new activity 

     notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
        | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     notification.flags = Notification.FLAG_AUTO_CANCEL; 

     PendingIntent intent = PendingIntent.getActivity(context, 0, 
        notificationIntent, 0); 
     notification.setLatestEventInfo(context, title, message, intent); 
     notificationManager.notify(0, notification); 




    } 

    class ForegroundCheckTask extends AsyncTask<Context, Void, Boolean> { 

     @Override 
     protected Boolean doInBackground(Context... params) { 
      final Context context = params[0].getApplicationContext(); 
      return isAppOnForeground(context); 
     } 

     private boolean isAppOnForeground(Context context) { 
      ActivityManager activityManager = (ActivityManager) context 
        .getSystemService(Context.ACTIVITY_SERVICE); 
      List<RunningAppProcessInfo> appProcesses = activityManager 
        .getRunningAppProcesses(); 
      if (appProcesses == null) { 
       return false; 
      } 
      final String packageName = context.getPackageName(); 
      for (RunningAppProcessInfo appProcess : appProcesses) { 
       if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND 
         && appProcess.processName.equals(packageName)) { 
        return true; 
       } 
      } 
      return false; 
     } 
    } 

:

<uses-permission android:name="com.myapp.libraryproject.permission.C2D_MESSAGE" /> 


<receiver 
      android:name="com.google.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" /> 

       <category android:name="com.myapp.libraryproject" /> 
      </intent-filter> 
     </receiver> 

     <service android:name="com.myapp.libraryproject.GCMIntentService" /> 

Manifest.xml 수출 라이트 프로젝트 (라이브러리로 사용 라이브러리 프로젝트) :

여기

내 GCMIntentService 클래스입니다
<uses-permission android:name="com.myapp.liteversion.permission.C2D_MESSAGE" /> 
<receiver 
       android:name="com.google.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" /> 

        <category android:name="com.myapp.liteversion" /> 
       </intent-filter> 
      </receiver> 

      <service android:name="com.myapp.libraryproject.GCMIntentService" /> 

답변

3

문제는 com.google.android.gcm.GCMBroadcastReceiver은 기본적으로 위치 GCMIntentService은 앱의 기본 패키지에 포함되어 있으며, 귀하의 경우에는 com.myapp.liteversion입니다. 그래서 GCMIntentService 클래스를 찾지 못합니다. 실제로는 com.myapp.libraryproject.GCMIntentService입니다.

이 솔루션은 GCMBroadcastReceiver의 하위 클래스를 만들고 (대신 기본 클래스의 매니페스트에서 사용) 그 안에 다음과 같은 방법을 재정의하는 것입니다

: 같은 것으로

protected String getGCMIntentServiceClassName(Context context) { 
    return getDefaultIntentServiceClassName(context); 
} 

protected String getGCMIntentServiceClassName(Context context) { 
    return GCMIntentService.class.getName(); 
} 
+0

감사합니다. 나는 이것을 해결했다. –