8

Android uygulamam 2.3 cihazda asla GCM mesajlarını almıyor, ancak 4.x cihazlarda çalışıyor. Tüm cihazları (2.3 ve 4.x) başarıyla kaydedebilirim. Ben this issue ile ilgili bir şey olabileceğini düşündüm, ama benim android manifest doğru şekilde yapılandırılmış gibi görünüyor. IntentService ve BroadcastReceiver'ımı gözetleme ve herhangi bir sorun fark edip etmediklerini görmek isteyen var mı? Herhangi bir yardım büyük takdir edilecektir. Hata ayıklayıcısını eklediğimde bildirim gönderirken onHandeIntent() öğesinin Android 2.3 için hiçbir zaman çağrılmadığını unutmayın. 4.x aygıtlarını kontrol ettim ve onHandleIntent() içindeki hata ayıklayıcısını tetiklerler. Teşekkürler!Android 4.x cihazları GCM mesajlarını alıyor, ancak Android 2.3 cihazları yok

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> 

Yayın Alıcısı:

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

Bildirim Niyet Servis

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

cevap

16

Görebileceğim ilk potansiyel sorun şudur:

permission öğesindeki paket adı, uses-permission öğesindeki ile aynı değildir. Uygulamamda (Android 2.2'yi hedefler) aynıdır.

<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

Evet, haklısınız. Bir şekilde matchtracker'ın 2. cevaptan bu [post] 'a kadar gerekli bir konfigürasyonun parçası olduğunu düşündüm (http://stackoverflow.com/questions/5660460/push-notifications-on-emulator-working-but-not-on-real -cihaz # cevabı-10723301). Şimdi daha iyi biliyorum. Bana yardım ettiğin için teşekkürler! – Daniel

+0

Rica ederim! – Eran

+1

@Eran GCM sorularının çoğuna yorum yaptığınızı görüyorum ve bu da bana GCM'yi çok iyi anlamış olmanızın gerektiği sonucuna götürüyor. Bu yüzden, bana GCM hakkında bilgi vermenizi rica ediyorum. Ben AndroidHive öğretici yaptım, ama çoğu karşı karşıyadır ** Ben de sunucu üzerinde başarılı kayıt rağmen, cihazda bildirimleri almak mümkün değildir **. Daha fazla makale okuma Ben onların AndroidHive öğretici ile karşılaştırıldığında, GCM için bazı güncelleme olduğunu tahmin ediyorum, bu yüzden bana bu güncellemelerin ne olduğunu ve bu öğreticide ne değişiklikler yapacağını bana bildirin. –

0

farklı applicationID ile ürün lezzet kullanıyorsanız, benim soru GCM mesajlarına answer android 2.3.6 v alınan ancak android 4.X v ince çalışmıyor bkz

0

GCM cihazda google oyun hizmetleri yüklü olmalıdır, ancak 2.3 sürümünde varsayılan olarak yüklenmez.

İlgili konular