8

Moja aplikacja na Androida nigdy nie odbiera komunikatów GCM na 2.3 urządzeniach, ale działa na urządzeniach 4.x. Mogę pomyślnie zarejestrować wszystkie urządzenia (2.3 i 4.x). Pomyślałem, że może to mieć coś wspólnego z this issue, ale wygląda na to, że mam poprawnie skonfigurowany mój manifest Androida. Czy ktoś będzie w stanie spojrzeć na moje IntentService i BroadcastReceiver i sprawdzić, czy zauważy jakiekolwiek problemy? Każda pomoc będzie bardzo ceniona. Zauważ, że onHandeIntent() nigdy nie jest wywoływany dla systemu Android 2.3 podczas wysyłania powiadomień, gdy mam podłączony debugger. Sprawdziłem urządzenia 4.x, które uruchamiają debugger w onHandleIntent(). Dzięki!Urządzenia z systemem Android 4.x odbierają wiadomości GCM, ale urządzenia z Androidem 2.3 Nie

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 Receiver:

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

Powiadomienie Intent usługi

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

Odpowiedz

16

Pierwszy potencjalny problem, jaki widzę, to:

Nazwa pakietu w elemencie permission nie jest taka sama jak w elemencie uses-permission. W mojej aplikacji (która dotyczy Androida 2.2) są identyczne.

<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

Tak, masz rację. W jakiś sposób myślałem, że matchtracker jest częścią niezbędnej konfiguracji od drugiej odpowiedzi do tego [post] (http://stackoverflow.com/questions/5660460/push-notifications-on-emulator-working-but-not-on-real -device # answer-10723301). Teraz wiem lepiej. Dzięki za pomoc w tym! – Daniel

+0

Nie ma za co! – Eran

+1

@Eran Widzę, że komentujesz większość pytań dotyczących GCM i to prowadzi mnie do wniosku, że musisz bardzo dobrze zrozumieć GCM. Tak więc, proszę o podanie mi informacji o GCM. Zrobiłem samouczek na AndroidHive, ale jak wielu z nich stoi w obliczu ** Ja też nie mogę odbierać powiadomień na urządzeniu **, pomimo pomyślnej rejestracji na serwerze. Czytanie dalszych artykułów Zgaduję, że jest to jakaś aktualizacja do GCM w porównaniu z samouczkiem na AndroidHive, więc plz poinformował mnie, jakie są aktualizacje i jakie zmiany wprowadzić w tym samouczku. –

0

Jeśli używasz smak produktów o różnej applicationId zobacz moją answer do komunikatów pytanie GCM nie są odbierane na Androidzie 2.3.6 v ale działa dobrze na Android 4.X v

0

GCM potrzebują usług Google Play zainstalowanych na urządzeniu, ale w wersji 2.3 nie jest on domyślnie instalowany.

Powiązane problemy