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());
}
}
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
Nie ma za co! – Eran
@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. –