8

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

Trả lời

16

Vấn đề tiềm năng đầu tiên tôi có thể thấy là:

Tên gói trong phần tử permission không giống với tên trong phần tử uses-permission. Trong ứng dụng của tôi (nhắm mục tiêu Android 2.2), chúng giống hệt nhau.

<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

Đú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

+0

Bạn được chào đón! – Eran

+1

@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 đó. –

0

Nếu bạn đang sử dụng hương vị sản phẩm với applicationId khác nhau, xem tôi answer cho câu hỏi điệp GCM không nhận được trên android 2.3.6 v nhưng làm việc tốt trên Android 4.x v

0

GCM cần dịch vụ google play được cài đặt trên thiết bị nhưng trong phiên bản 2.3, dịch vụ này không được cài đặt theo mặc định.