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());
}
}
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
Rica ederim! – Eran
@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. –