2015-01-14 148 views
4

在我的应用程序中,我尝试接收来自服务器的通知,但我没有收到消息。有一段时间我有这个异常(但不是全部时间):推送通知未收到android

E/com.parse.ManifestInfo﹕ Cannot use GCM for push because the app manifest is missing some required declarations. Please make sure that these permissions are declared as children of the root <manifest> element: 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<permission android:name="com.test.parsepushnotification.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="com.test.parsepushnotification.permission.C2D_MESSAGE" /> 
Also, please make sure that these services and broadcast receivers are declared as children of the <application> element: 
<service android:name="com.parse.PushService" /> 
<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="com.test.parsepushnotification" /> 
</intent-filter> 
</receiver> 
E/com.parse.PushService﹕ Tried to use push, but this app is not configured for push due to: Push is not configured for this app because the app manifest is missing required declarations. Please add the following declarations to your app manifest to support either GCM or PPNS for push (or both). To enable GCM support, please make sure that these permissions are declared as children of the root <manifest> element: 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<permission android:name="com.test.parsepushnotification.permission.C2D_MESSAGE" android:protectionLevel="signature" /> 
<uses-permission android:name="com.test.parsepushnotification.permission.C2D_MESSAGE" /> 
Also, please make sure that these services and broadcast receivers are declared as children of the <application> element: 
<service android:name="com.parse.PushService" /> 
<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="com.test.parsepushnotification" /> 
</intent-filter> 
</receiver> 
To enable PPNS support, please make sure that these permissions are declared as children of the root <manifest> element: 
<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" /> 
Also, please make sure that these services and broadcast receivers are declared as children of the <application> element: 
<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> 

但我接受它不是所有的时间。代码: 应用:

public class TestApplication extends Application { 
@Override 
public void onCreate() { 
    super.onCreate(); 

    // Enable Local Datastore. 
    Parse.enableLocalDatastore(this); 
    Parse.initialize(this, appKey, clientKey); 
    ParsePush.subscribeInBackground("", new SaveCallback() { 
     @Override 
     public void done(ParseException e) { 
      if (e == null) { 
       Log.d("com.parse.push", "successfully subscribed to the broadcast channel."); 
      } else { 
       Log.e("com.parse.push", "failed to subscribe for push", e); 
      } 
     } 
    }); 

    ParseUser.enableAutomaticUser(); 
    ParseACL defaultACL = new ParseACL(); 
    // Optionally enable public read access. 
    // defaultACL.setPublicReadAccess(true); 
    ParseACL.setDefaultACL(defaultACL, true); 
} 
} 

所有时间SaveCallback回报 “成功订阅广播频道。”即使我得到上面提到的异常。

清单

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.test.parsepushnotification" > 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 
<permission 
    android:name="com.test.parsepushnotification.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 
<uses-permission android:name="com.test.parsepushnotification.permission.C2D_MESSAGE" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:name=".TestApplication" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name=".MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

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

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

    <receiver android:name="com.test.parsepushnotification.PushReceiver" 
     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="com.test.parsepushnotification" /> 
     </intent-filter> 
    </receiver> 
    <receiver android:name="com.parse.ParsePushBroadcastReceiver" 
     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> 
    <meta-data android:name="com.parse.push.notification_icon" android:resource="@drawable/ic_launcher"/> 
</application> 

</manifest> 

MainActivity.java

public class MainActivity extends Activity{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ParseAnalytics.trackAppOpenedInBackground(getIntent()); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activit); 
    } 
} 

PushReceiver.java

public class PushReceiver extends BroadcastReceiver { 

    private static final String TAG = "PushReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(TAG, "Message accept"); 
    showNotification(); 

    } 
} 

预先感谢任何帮助。

+0

至于你的代码,你应该划分接收部分和通知UI部分。我的意思是UI部分与 这个问题没有关系,但也关于UI部分 line manager.notify(1,builder.build()); id \t此通知的标识符在您的应用程序中是唯一的。 来自文档http://developer.android.com/reference/android/app/NotificationManager.html#notify(int,android.app.Notification) 因此ID必须是唯一的 –

+0

您的设备是否支持GCM ?您可以通过[推送通知测试](https://play.google.com/store/apps/details?id=com.firstrowria.pushnotificationtester&hl=zh-CN)测试该功能。为什么您需要两种方式来接收消息:解析和GCM ? – gio

+0

@gio我只使用一种方法来接收消息。我上面描述的所有代码。同样在https://www.parse.com/docs/push_guide#installations/Android中描述:“如果可能,解析库使用Google云消息传递(GCM)提供推送通知” – Dima

回答

1

从有问题的清单,
<receiver android:name="com.test.parsepushnotification.PushReceiver" android:permission="com.google.android.c2dm.permission.SEND">
提到在Quick Start | Parse
<receiver android:name="com.parse.GcmBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
更改后的包的名称可能会导致从解析的侧识别的问题。

谢谢你让我们知道它的工作。