2015-01-14 146 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">
更改後的包的名稱可能會導致從解析的側識別的問題。

謝謝你讓我們知道它的工作。