Ứng dụng Android của tôi không bao giờ nhận được tin nhắn GCM trên 2.3 thiết bị, nhưng nó hoạt động trên thiết bị 4.x. Tôi có thể đăng ký tất cả các thiết bị (2.3 và 4.x) thành công. Tôi nghĩ rằng nó có thể có một cái gì đó để làm với this issue, nhưng có vẻ như tôi có biểu hiện android của tôi cấu hình đúng cách. Có ai có thể đánh dấu IntentService và BroadcastReceiver của tôi và xem họ có nhận thấy bất kỳ vấn đề nào không? Mọi sự trợ giúp sẽ rất được trân trọng. Lưu ý rằng onHandeIntent() không bao giờ được gọi cho Android 2.3 khi gửi thông báo trong khi tôi đã đính kèm trình gỡ rối. Tôi đã kiểm tra thiết bị 4.x và chúng kích hoạt trình gỡ rối trong onHandleIntent(). Cảm ơn!Thiết bị Android 4.x nhận tin nhắn GCM, nhưng thiết bị Android 2.3 Không
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);
}
}
Thông báo Ý định Dịch vụ
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());
}
}
Đúng, bạn nói đúng. Tôi bằng cách nào đó nghĩ rằng matchtracker là một phần của một cấu hình cần thiết từ câu trả lời thứ 2 cho [post] này (http://stackoverflow.com/questions/5660460/push-notifications-on-emulator-working-but-not-on-real -device # answer-10723301). Bây giờ tôi biết rõ hơn. Cảm ơn vì đã giúp tôi với điều này! – Daniel
Bạn được chào đón! – Eran
@Eran Tôi thấy bạn nhận xét về hầu hết các câu hỏi của GCM và điều đó dẫn tôi đến kết luận rằng bạn phải có hiểu biết rất tốt về GCM. Vì vậy, tôi sẽ yêu cầu bạn cung cấp cho tôi một số thông tin về GCM. Tôi đã làm các hướng dẫn AndroidHive, nhưng như nhiều người trong số họ đang phải đối mặt ** Tôi cũng không thể nhận được thông báo trên thiết bị **, mặc dù đăng ký thành công trên máy chủ. Đọc thêm bài viết Tôi đoán rằng họ là một số cập nhật cho GCM so với hướng dẫn AndroidHive, vì vậy plz cho tôi biết rằng những gì các bản cập nhật và những gì thay đổi để thực hiện trong hướng dẫn đó. –