2014-07-14 1 views
1

J'ai un projet en tant que bibliothèque à exporter vers la version allégée de mon projet. Dans le projet de bibliothèque, j'ai implémenté des notifications push. J'ai exécuté le projet de bibliothèque comme projet normal et la notification push fonctionne correctement. Mon problème se produit lorsque j'importe ce projet en tant que bibliothèque dans le projet version Lite. La notification push a échoué.Recevoir des notifications push dans le projet de bibliothèque

Voici ma classe GCMIntentService:

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; 
     } 
    } 

Le Manifest.xml dans le projet de bibliothèque:

<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" /> 

Le Manifest.xml dans l'exportation projet Lite (utilisation projet de bibliothèque comme bibliothèque):

<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" /> 

Répondre

3

Votre problème est que com.google.android.gcm.GCMBroadcastReceiver suppose, par défaut, que l'emplacement de GCMIntentService est dans le paquet principal de votre application, qui dans votre cas est com.myapp.liteversion. C'est pourquoi il ne trouve pas la classe GCMIntentService, qui est actuellement en com.myapp.libraryproject.GCMIntentService.

La solution consiste à créer une sous-classe de GCMBroadcastReceiver (et l'utiliser dans le manifeste au lieu de la classe de base), et à remplacer la méthode suivante:

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

à quelque chose comme:

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

Merci à vous. J'ai résolu cela. –