Processar a recepção de notificações no Android

na minha aplicação android estou a ter este erro quando tento receber a notificação de push no logcat:

6-22 14:38:16.016 6570-6570/com.tekinarslan.material.exemplo E / com.analisar.O ManifestInfo﹕ não pode usar o GCM para empurrar porque a aplicação falta ao manifesto algumas declarações necessárias. Por favor, certifique-se que estas permissões são declaradas como filhos da raiz elemento: Além disso, por favor, certifique-se de que estes os serviços e os receptores de radiodifusão são declarados como filhos do elemento: 06-22 14: 38: 16.021 6570-6570/com.tekinarslan.material.amostra e / com.analisar.Serviço de flexão﹕ Tentou usar o push, mas esta aplicação não está configurada para o push devido ao: O Push não está configurado para esta aplicação porque a lista de aplicações é declarações obrigatórias em falta. Acrescentar as seguintes declarações: para o seu manifesto app para suportar GCM ou PPNS para o push (ou quer). Para activar o suporte do GCM, certifique-se que estas permissões são declarados como filhos do elemento raiz: Além disso, certifique-se de que estes serviços e receptores de radiodifusão são declarados como filhos do elemento: Para activar o suporte do PPNS, certifique-se que estas permissões são declaradas como filhos do elemento raiz: Além disso, certifique-se de que estes serviços e receptores de radiodifusão são declarados como filhos do elemento:

Acho que tenho tudo o que preciso no meu manifesto, aqui está:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.tekinarslan.material.sample"
    android:versionCode="1"
    android:versionName="1.0">
    <uses-sdk android:minSdkVersion="9"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <!-- Permissions required for parse.com notifications -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <!-- END Parse permissions -->

    <!--
      IMPORTANT: Change "com.parse.tutorials.pushnotifications.permission.C2D_MESSAGE" in the lines below
      to match your app's package name + ".permission.C2D_MESSAGE".
    -->
    <permission android:protectionLevel="signature"
        android:name="com.tekinarslan.material.sample.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.tekinarslan.material.sample.permission.C2D_MESSAGE" />

    <application
        android:name=".App"
        android:allowBackup="true"
        android:label="DONUT"
        android:theme="@style/AppTheme" >
        <meta-data
            android:name="com.facebook.sdk.ApplicationId"
            android:value="@string/facebook_app_id"/>
        <activity
            android:name=".SampleActivity"
            android:label="@string/app_name" >

        </activity>
        <activity
            android:name=".FbLoginActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            </activity>


        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"/>

        <!-- My custom receiver -->
        <receiver android:name=".ParseReceiver" >
            <intent-filter>
                <action android:name="com.tekinarslan.material.sample.RECEIVE_PUSH" />
            </intent-filter>
        </receiver>
        <!-- END my custom receiver -->


        <!-- Required for Parse.com notifications -->
        <service android:name="com.parse.PushService" />

        <receiver android:name="com.parse.ParseBroadcastReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
        <!-- END Parse.com requirements -->

    </application>

</manifest>

* * O meu analisador - * *

package com.tekinarslan.material.sample;

import java.util.Iterator;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
/*****************************
 * This class will receive custom push notifications
 * from parse.com. These are different than the "plain"
 * message push notifications. 
 * 
 * There must be an action defined within the Intent-Filter
 * for this receiver in the manifest.xml file. And the same
 * action must be specified on the notification when it is
 * pushed.
 * 
 * You can optionally pass JSON data from parse.com which will
 * be avaialable in the onReceive() method here.
 *****************************/
public class ParseReceiver extends BroadcastReceiver {
    private final String TAG = "Parse Notification";
    private String msg = "";
    @Override
    public void onReceive(Context ctx, Intent intent) {
        Log.i(TAG, "PUSH RECEIVED!!!");

        try {
            String action = intent.getAction();
            String channel = intent.getExtras().getString("com.parse.Channel");
            JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));

            Log.d(TAG, "got action " + action + " on channel " + channel + " with:");
            Iterator itr = json.keys();
            while (itr.hasNext()) {
                String key = (String) itr.next();
                Log.d(TAG, "..." + key + " => " + json.getString(key));
                if(key.equals("string")){
                    msg = json.getString(key);
                }
            }
        } catch (JSONException e) {
            Log.d(TAG, "JSONException: " + e.getMessage());
        }


        Bitmap icon = BitmapFactory.decodeResource(ctx.getResources(),
                R.drawable.ic_launcher);

        Intent launchActivity = new Intent(ctx, SampleActivity.class);
        PendingIntent pi = PendingIntent.getActivity(ctx, 0, launchActivity, 0);

        Notification noti = new NotificationCompat.Builder(ctx)
        .setContentTitle("PUSH RECEIVED")
        .setContentText(msg)
        .setSmallIcon(R.drawable.ic_launcher)
        .setLargeIcon(icon)
        .setContentIntent(pi)
        .setAutoCancel(true)
        .build();

        NotificationManager nm = (NotificationManager)ctx.getSystemService(Context.NOTIFICATION_SERVICE);
        nm.notify(0, noti);

    }

}
Author: Aditi Parikh, 2015-06-23

2 answers

O seu receptor personalizado necessita das seguintes acções nos filtros de intenção:

<receiver
  android:name=".ParseReceiver"
  android:exported="false">
  <intent-filter>
    <action android:name="com.parse.push.intent.RECEIVE"/>
    <action android:name="com.parse.push.intent.DELETE"/>
    <action android:name="com.parse.push.intent.OPEN"/>
    ...
  </intent-filter>
</receiver>

<receiver
  android:name="com.parse.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="at.a1telekom.android.newsroom"/>
  </intent-filter>
</receiver>

Editar:

Estás a subscrever-te a parse assim?
Parse.initialize(context, appId, clientKey);    
ParsePush.subscribeInBackground( yourChannels, new SaveCallback() {...});
 0
Author: Rich, 2015-06-23 08:55:22
Faltam-te o código indicado no manifesto. Incluir o código indicado no fundo do ficheiro Manifesto antes da marca.
 <receiver
        android:name="com.parse.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" />

            <!-- IMPORTANT: Change "com.parse.tutorials.pushnotifications" to match your app's package name. -->
            <category android:name="com.tekinarslan.material.sample" />
        </intent-filter>
    </receiver>
    <receiver
        android:name="com.tekinarslan.material.sample.NotificationReceiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="com.tekinarslan.material.sample.UPDATE_STATUS" />
        </intent-filter>
    </receiver>
 0
Author: Rasika Sugathadasa, 2015-06-23 06:27:34