GCM实施失败

时间:2014-07-11 11:47:01

标签: android push-notification google-cloud-messaging

我有很大的问题。 我在google文档中创建了服务器api-key。创建IntentService和BroadcastReceiver。我将RegistrationId放在我的服务器上,但是我没有从谷歌服务器收到推送消息。 这是我的代码,你能告诉我,我做错了吗? IntentService:

public class GcmIntentService extends IntentService{
Context context;
public static final int NOTIFICATION_ID = 1;
private NotificationManager mNotificationManager;
NotificationCompat.Builder builder;
public static final String TAG = "GCM Demo";

public GcmIntentService() {
    super(SENDER_ID);//"GcmIntentService");//
    // TODO Auto-generated constructor stub
}

@Override
protected void onHandleIntent(Intent intent) {
    // TODO Auto-generated method stub
    Bundle extras = intent.getExtras();
    String msg = intent.getStringExtra("message");
    GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
    String messageType = gcm.getMessageType(intent);

     if (!extras.isEmpty()) {

         if (GoogleCloudMessaging.
                    MESSAGE_TYPE_SEND_ERROR.equals(messageType)) {
                sendNotification("Send error: " + extras.toString());
            } else if (GoogleCloudMessaging.
                    MESSAGE_TYPE_DELETED.equals(messageType)) {
                sendNotification("Deleted messages on server: " +
                        extras.toString());
            // If it's a regular GCM message, do some work.
            } else if (GoogleCloudMessaging.
                    MESSAGE_TYPE_MESSAGE.equals(messageType)) {
                // This loop represents the service doing some work.
                for (int i=0; i<5; i++) {
                    Log.i(TAG, "Working... " + (i+1)
                            + "/5 @ " + SystemClock.elapsedRealtime());
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                    }
                }
                Log.i(TAG, "Completed work @ " + SystemClock.elapsedRealtime());
                // Post notification of received message.
                //sendNotification("Received: " + extras.toString());
                sendNotification(msg);
                Log.i(TAG, "Received: " + extras.toString());
            }
        }
     GcmBroadcastReceiver.completeWakefulIntent(intent);
}
private void sendNotification(String msg) {
    mNotificationManager = (NotificationManager)
            this.getSystemService(Context.NOTIFICATION_SERVICE);

    Intent myintent = new Intent(this, ReceiveActivity.class);
    myintent.putExtra("message", msg);
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
            //new Intent(this, BaseActivity.class), 0);
            myintent, PendingIntent.FLAG_UPDATE_CURRENT);

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

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

}

广播:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub

    // Explicitly specify that GcmIntentService will handle the intent.
    ComponentName comp = new ComponentName(context.getPackageName(),
            GcmIntentService.class.getName());
    // Start the service, keeping the device awake while it is launching.
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);


}

}

清单:

package="*.*"
android:versionCode="329"
android:versionName="1.0.3"
android:installLocation="auto">
<uses-sdk android:minSdkVersion="8"
    android:targetSdkVersion="19" />

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

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

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>



    <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />
    <receiver
        android:name="*.*.cgm.GcmBroadcastReceiverCompat"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />

            <category android:name="*.*.cgm" />
        </intent-filter>
    </receiver>

    <activity android:name=".screens.StartingActivity" android:screenOrientation="portrait" 
        android:theme="@android:style/Theme.NoDisplay">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>    
    </activity>       

<service android:name="*.*.cgm.GcmIntentService" />
...

最诚挚的问候。

2 个答案:

答案 0 :(得分:1)

如果您的应用包是*.*,则权限应为:

<permission android:name="*.*.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="*.*.permission.C2D_MESSAGE" />

(不含gcm

广播接收器中的类别也应该没有gcm

<category android:name="*.*" />

如果您的意图服务类位于 .gcm,而您的应用程序包是,则以下代码将无效,因为它将查找意向服务在主要包装中:

ComponentName comp = new ComponentName(context.getPackageName(),
        GcmIntentService.class.getName());

您应该将其替换为:

ComponentName comp = new ComponentName(GCMIntentService.class.getPackage().getName(),
        GcmIntentService.class.getName());

答案 1 :(得分:0)

  1. 尝试使用onMessage重写方法,您可能会收到。
  2. 尝试在Google API控制台中创建浏览器密钥而不是Android密钥并使用它。
  3. 使用com.google.android.gcm.GCMBroadcastReceiver代替 .cgm.GcmBroadcastReceiverCompat
  4. 谢谢,这可能对你有帮助。