7

Có ai có thể giúp tôi làm ví dụ làm việc để nhận tin nhắn từ gcm bằng Google Cloud Messaging dành cho Android hay không. Tôi đã thử cả hai cách (thư viện trợ giúp và lớp GoogleCloudMessaging) và không có gì có vẻ hiệu quả. Tôi đang sử dụng một kịch bản PHP cho thấy như sau:Không thể nhận tin nhắn bằng Google Cloud Messaging dành cho Android (không phải là thư viện trợ giúp)

Multicast ID: 5.2108110103215E + 18 Tổng số thông điệp xử lý thành công: 1 Tổng số thông điệp với các lỗi xử lý: 0 ID Canonical: 0

Vì vậy, dường như everithing là OK. Tôi có thể đăng ký thiết bị theo cả hai cách, sử dụng thư viện trợ giúp (gcm.jar) và sử dụng lớp GoogleCloudMessaging. Vấn đề là không có cách nào thông điệp tôi gửi qua PHP đến, hoặc ít nhất tôi không biết cách xử lý nó một cách chính xác. Dưới đây là các điều khoản và người nhận từ biểu hiện của tôi:

<permission android:name="com.example.gcm.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" />  
<uses-permission android:name="android.permission.USE_CREDENTIALS" /> 
<uses-permission android:name="android.permission.READ_OWNER_DATA" /> 

<receiver 
     android:name="com.google.android.gcm.GCMBroadcastReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" > 
     <intent-filter> 

      <!-- Receives the actual messages. --> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <!-- Receives the registration id. --> 
      <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> 

      <category android:name="com.example.gcm" /> 
     </intent-filter> 
    </receiver> 
<service android:name=".GCMIntentService" /> 

Cuối cùng đây là lớp dịch vụ

public class GCMIntentService extends GCMBaseIntentService { 

private static final String PROJECT_ID = "49XXXXXXXX6";  
private static final String TAG = "GCM Intent Service"; 

public GCMIntentService() 
{ 
    super(PROJECT_ID); 
    Log.d(TAG, "GCMIntentService init"); 
} 


@Override 
protected void onError(Context ctx, String sError) { 

    Log.d(TAG, "Error: " + sError);  
} 

@Override 
protected void onMessage(Context ctx, Intent intent) { 

    Log.d(TAG, "Message Received"); 

    String message = intent.getStringExtra("message"); 

    sendGCMIntent(ctx, message); 

} 


private void sendGCMIntent(Context ctx, String message) { 

    Intent broadcastIntent = new Intent(); 
    broadcastIntent.setAction("GCM_RECEIVED_ACTION"); 

    broadcastIntent.putExtra("gcm", message); 

    ctx.sendBroadcast(broadcastIntent); 

} 

@Override 
protected void onRegistered(Context ctx, String regId) { 

    Log.d(TAG, regId); 

    // Notify main UI to update registration status 
    Intent registrationIntent = new Intent(); 
    registrationIntent.setAction("registered"); 
    registrationIntent.putExtra("regId", regId); 
    sendBroadcast(registrationIntent);  
} 

@Override 
protected void onUnregistered(Context ctx, String regId) { 
    //... 

} 
} 

đây là mã khi sử dụng lớp GoogleCloudMessaging (Tôi đã thay đổi biểu hiện sử dụng máy thu tùy chỉnh):

public class GCMBroadcastReceiver extends BroadcastReceiver { 

private static final String TAG = "GCM Receiver"; 
public static final int NOTIFICATION_ID = 1; 
private NotificationManager mNotificationManager; 
private Context ctx; 

@Override 
public void onReceive(Context context, Intent intent) { 

    Log.d(TAG, "Message received"); 

    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context); 
    ctx = context; 
    String messageType = gcm.getMessageType(intent); 
    if (GoogleCloudMessaging.MESSAGE_TYPE_SEND_ERROR.equals(messageType)) { 
     sendNotification("Send error: " + intent.getExtras().toString()); 
    } 
    else if (GoogleCloudMessaging.MESSAGE_TYPE_DELETED 
      .equals(messageType)) { 
     sendNotification("Deleted messages on server: " 
       + intent.getExtras().toString()); 
    } 
    else { 
     sendNotification("Received: " + intent.getExtras().toString()); 
    } 
    setResultCode(Activity.RESULT_OK); 
} 

// Put the GCM message into a notification and post it. 
private void sendNotification(String msg) { 
    mNotificationManager = (NotificationManager) ctx 
      .getSystemService(Context.NOTIFICATION_SERVICE); 

    PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, 
      new Intent(ctx, MainActivity.class), 0); 

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
      ctx).setSmallIcon(R.drawable.ic_launcher_temp) 
      .setContentTitle("GCM Notification") 
      .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) 
      .setContentText(msg); 

    mBuilder.setContentIntent(contentIntent); 
    mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build()); 
} 

}

Cái này là everythin g có vẻ là ok, nhưng tin nhắn không bao giờ đến. Bất kỳ ý tưởng ?? Cảm ơn trước.

+0

hướng dẫn rất hay tại đây http://tech-papers.org/google-cloud-messaging-gcm-for-android-and-push-notifications-2/ –

Trả lời

7

Thêm dòng sau trong manifeast bạn

<permission 
    android:name="PACKAGE_NAME.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

<uses-permission android:name="PACKAGE_NAME.permission.C2D_MESSAGE" /> 

<!-- App receives GCM messages. --> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
+0

Xin lỗi bạn đã đúng, nhưng đó là vấn đề khi sao chép tệp kê khai vào bài đăng. Tệp kê khai của tôi thực sự có quyền và tôi đã cập nhật bài đăng. Ý tưởng nào khác? Cảm ơn. –

2

manifest của bạn thiếu một số điều khoản:

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<permission android:name="com.example.gcm.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" /> 

EDIT:

Trong biểu hiện của bạn bạn đang sử dụng com.google.android.gcm.GCMBroadcastReceiver. Đó là một lớp học từ thư viện trợ giúp cũ (gcm.jar) bắt đầu một dịch vụ ý định. Nếu bạn muốn sử dụng thư viện trợ giúp, bạn nên xác định dịch vụ ý định trong tệp kê khai của mình.

Nếu bạn không muốn sử dụng thư viện trợ giúp, bạn nên thay đổi gói GCMBroadcastReceiver trong tệp kê khai thành gói của lớp GCMBroadcastReceiver mà bạn đưa vào câu hỏi của mình. Nếu không, lớp đó sẽ không được sử dụng.

+0

Xin lỗi bạn đã đúng, nhưng đó là vấn đề khi sao chép tệp kê khai cho bài đăng. Tệp kê khai của tôi thực sự có quyền và tôi đã cập nhật bài đăng. Bạn có ý tưởng nào khác không? Cảm ơn. –

+0

@AlejandroCasanova Nếu bạn đang sử dụng lớp 'GCMBroadcastReceiver' mà bạn đưa vào câu hỏi, bạn không cần' GCMIntentService'. Tuy nhiên, tệp kê khai của bạn đề cập đến 'com.google.android.gcm.GCMBroadcastReceiver'. Gói phần mềm của "GCMBroadcastReceiver' mà bạn đưa vào câu hỏi là gì? Nó có thể không phải là 'com.google.android.gcm' (và nếu nó là, nó không nên được). Tôi đoán là tệp kê khai của bạn đề cập đến 'GCMBroadcastReceiver' mặc định của Google và đó là lý do mã của bạn không hoạt động. – Eran

+0

Tôi đã cập nhật tệp kê khai với GCMIntentService bị thiếu. Trên thực tế tôi có hai ví dụ và không ai trong số họ làm việc. Đầu tiên sử dụng tệp kê khai hiện tại với GCMIntentService và thư viện trợ giúp. Tôi nghĩ rằng thời gian này không có gì là mất tích. Dự án thứ hai không sử dụng thư viện trợ giúp và người nhận trong tệp kê khai như sau: Lần này không có GCMIntentService. Người nhận trong ví dụ thứ hai là người nhận trong câu hỏi. Vẫn còn bị mắc kẹt: ( –

0

Đừng quên thay đổi 'com.example.gcm' để tên gói của bạn ví dụ 'com.yourdomain.yourapp'

+0

Đó là gói tôi đã sử dụng cho ứng dụng demo. –

0

Bạn đang sử dụng GCMBaseIntentService đã không được Google chấp nhận. (Nhưng nó vẫn còn làm việc.) Tôi theo các hướng dẫn mới nhất http://developer.android.com/google/gcm/client.html và đã nhận được tin nhắn. Bạn cũng có thể thử nó.

Một lý do khác có thể là bạn có thể đã nhận được một tin nhắn nhưng nó không được hiển thị trong thông báo thành công. Thêm dòng này vào phương thức: sendNotification (String msg)

Log.i(TAG, msg); 
1

Sau khi sửa các vấn đề trên vẫn không có thông báo đẩy. Vấn đề là lỗi 403. Có vẻ như dịch vụ đó không có sẵn ở Cuba, vì vậy giải pháp là sử dụng một công cụ như "tự do của bạn" hoặc "thor", v.v.