8

Meine Android-App empfängt GCM-Nachrichten auf Geräten mit 2,3 niemals, aber es tut 4.x-Geräte. Ich kann alle Geräte (2.3 und 4.x) erfolgreich registrieren. Ich dachte, es könnte etwas mit this issue zu tun haben, aber es scheint, als hätte ich mein Android-Manifest richtig konfiguriert. Würde jemand in der Lage sein, meinen IntentService und BroadcastReceiver zu überprüfen und zu sehen, ob sie irgendwelche Probleme bemerken? Jede Hilfe würde sehr geschätzt werden. Beachten Sie, dass onHandeIntent() niemals für Android 2.3 aufgerufen wird, wenn Benachrichtigungen gesendet werden, während ich den Debugger angehängt habe. Ich habe 4.x-Geräte überprüft, und sie lösen den Debugger in onHandleIntent() aus. Danke!Android 4.x-Geräte empfangen GCM-Nachrichten, aber Android 2.3-Geräte Do not

Android Manfest:

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

    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="17" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="android.permission.WAKE_LOCK" /> 
    <uses-permission android:name="android.permission.VIBRATE" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
    <uses-permission android:name="my.package.matchtracker.permission.C2D_MESSAGE" /> 
    <permission android:name="my.package.permission.C2D_MESSAGE" 
     android:protectionLevel="signature" /> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <receiver 
      android:name=".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="my.package" /> 
      </intent-filter> 
     </receiver> 
     <service android:name=".NotificationIntentService" android:enabled="true" /> 
     <activity android:name="com.gigya.socialize.android.GSWebViewActivity" /> 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:configChanges="orientation|screenSize" 
      android:theme="@android:style/Theme.NoTitleBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Broadcast-Empfänger:

package my.package; 

import android.app.*; 
import android.content.*; 

public class GcmBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     NotificationIntentService.runIntentInService(context, intent); 
     setResultCode(Activity.RESULT_OK); 
    } 
} 

Intent Notification Service

public class NotificationIntentService extends IntentService { 
    private String TAG = "NotificationIntentService"; 
    public NotificationIntentService() { 
     super(AppConstants.GCM_SENDER_ID); 
    } 

    public NotificationIntentService(String name) { 
     super(name); 
     // TODO Auto-generated constructor stub 
    } 

    private static PowerManager.WakeLock sWakeLock; 
    private static final Object LOCK = NotificationIntentService.class; 

    static void runIntentInService(Context context, Intent intent) { 
     synchronized(LOCK) { 
      if (sWakeLock == null) { 
       PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
       sWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "my_wakelock"); 
      } 
     } 
     sWakeLock.acquire(); 
     intent.setClassName(context, NotificationIntentService.class.getName()); 
     context.startService(intent); 
    } 

    public final void onHandleIntent(Intent intent) { 
     try { 
      String action = intent.getAction(); 
      if (action.equals("com.google.android.c2dm.intent.REGISTRATION")) { 
       //don't care. 
      } else if (action.equals("com.google.android.c2dm.intent.RECEIVE")) { 
       handleMessage(intent); 
      } 
     } finally { 
      synchronized(LOCK) { 
       sWakeLock.release(); 
      } 
     } 
    } 

    private void handleMessage(Intent intent) { 
     Bundle b = intent.getExtras(); 
     String text = b.getString("text"), 
       title = b.getString("title"), 
       largeImageUrl = b.getString("largeImageUrl"); 
     Log.i(TAG, "Message is " + text); 
     NotificationManager nm = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE); 
     Bitmap bit=null; 
     if (largeImageUrl != null && !largeImageUrl.isEmpty()) { 
      try{bit = BitmapFactory.decodeStream((InputStream)new URL(largeImageUrl).getContent()); 
      } catch (Exception e){} 
     } 
     NotificationCompat.Builder nc = new NotificationCompat.Builder(this) 
              .setContentTitle(title) 
              .setContentText(text) 
              .setSmallIcon(R.drawable.ic_launcher) 
              .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
              .setAutoCancel(true) //notification disappears when clicked 
              .setContentIntent(PendingIntent.getActivity(this, 0, 
                new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT)); 
     //bit = Bitmap.createScaledBitmap(bit, android.R.dimen.notification_large_icon_width, android.R.dimen.notification_large_icon_height, true); 
     if (bit != null) nc.setLargeIcon(bit); 
     nm.notify(0, nc.build()); 
    } 
} 

Antwort

16

Das erste mögliche Problem, das ich sehen kann, ist das:

Der Paketname im Element permission ist nicht das gleiche wie das im Element uses-permission. In meiner App (die auf Android 2.2 ausgerichtet ist) sind sie identisch.

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<uses-permission android:name="my.package.matchtracker.permission.C2D_MESSAGE" /> 
<permission android:name="my.package.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
+0

Ja, du hast Recht. Ich dachte irgendwie, dass Matchtracker Teil einer notwendigen Konfiguration aus der 2. Antwort zu diesem [Post] (http://stackoverflow.com/questions/5660460/push-notifications-on-emulator-working-but-not-on-real) war -device # answer-10723301). Jetzt weiß ich es besser. Danke, dass Sie mir dabei geholfen haben! – Daniel

+0

Gern geschehen! – Eran

+1

@Eran Ich sehe, dass Sie die meisten GCM-Fragen kommentieren, und das führt mich zu der Schlussfolgerung, dass Sie ein sehr gutes Verständnis von GCM haben müssen. Also würde ich Sie bitten, mir Informationen über GCM zu geben. Ich habe das AndroidHive-Tutorial gemacht, aber wie viele von ihnen sind konfrontiert ** Ich kann auch keine Benachrichtigungen auf dem Gerät **, trotz der erfolgreichen Registrierung auf dem Server. Wenn ich weitere Artikel lese, vermute ich, dass es sich um ein Update des GCM im Vergleich zum AndroidHive-Tutorial handelt. Lassen Sie mich bitte wissen, was die Updates sind und welche Änderungen in diesem Tutorial vorgenommen werden. –

0

Wenn Sie Produktgeschmack mit verschiedenen applicationId verwenden, finden Sie meine answer auf die Frage GCM-Nachrichten werden nicht auf Android 2.3.6 v empfangen, aber gut funktioniert auf Android 4.X v

0

GCM Google Play-Dienste müssen auf dem Gerät installiert sein, aber in Version 2.3 wird es nicht standardmäßig installiert.