2016-05-12 128 views
8

在解析控制台中,它显示传递报告成功,但onPushReceive根本没有被调用。我在这里错过了什么?任何帮助,将不胜感激。无法在Android中使用Parse接收推送通知

以下是我的代码。 清单代码:

<receiver 
     android:name="com.google.android.gms.gcm.GcmReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="com.appname" /> 
     </intent-filter> 
    </receiver> 

    <service android:name="com.parse.PushService" /> 

    <receiver android:name="com.appname.PushReceiver" 
     android:permission="com.google.android.c2dm.permission.SEND" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.parse.push.intent.RECEIVE" /> 
      <action android:name="com.parse.push.intent.OPEN" /> 
      <action android:name="com.parse.push.intent.DELETE" /> 
     </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" /> 

      <!--IMPORTANT: Change "com.parse.starter" to match your app's package name.--> 

      <category android:name="com.appname" /> 
     </intent-filter> 
    </receiver> 

PushReceiver类:

public class PushReceiver extends ParsePushBroadcastReceiver 
{ 

@Override 
protected void onPushReceive(Context context, Intent intent) { 
    super.onPushReceive(context, intent); 

    Log.v("Push Receive called...", ""); 


    if (intent == null) 
     return; 

    try 
    { 
     JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data")); 



    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
} 



} 
+0

可能是你的google-services.json中的错误 – Alexander

+0

解析被关闭。你应该转移到另一项服务。 –

+0

@DevendraSingh Ya我知道,这只是几个月的临时解决方案。 – Anirudh

回答

1

检查安装的对象与设备令牌。 (也许你应该设置senderID)

似乎不推荐使用。我现在无法从解析文档中找到任何地方。 尝试添加以下权限

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

这些都需要老版本的SDK(也许年龄大于1.10)的权限。

==============新建部分====

我发现github上推的示例代码。 https://github.com/ParsePlatform/PushTutorial/tree/master/Android

以下是使用1.11.0 sdk(1.13.0也可以)的项目。 https://dl.dropboxusercontent.com/u/82261293/Appname.zip

根据我的经验,有些设备有没有设备令牌的机会。你应该检查它已经保存。

+0

我在发布问题前添加了这些权限。不起作用。 – Anirudh

+0

您是否有deviceToken,必须保存在数据库中? – ChunTingLin

2

添加权限:

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

检查接收器:

<receiver android:name="com.appname.PushReceiver" android:exported="false"> 
    <intent-filter> 
     <action android:name="com.appname.INTERCEPT"/> 
    </intent-filter> 
</receiver> 
2

我这里还有权限,你应该在你的清单:

<!-- Push Permissions --> 
    <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.VIBRATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

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

我这里还有其他的东西你应在您的清单中定义:

<service android:name="com.parse.PushService" /> 
     <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> 
     <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="your_package_name" /> 
      </intent-filter> 
     </receiver> 

摇篮的依赖关系:

compile 'com.parse.bolts:bolts-android:1.+' 
compile 'com.parse:parse-android:1.+' 

根据该清单的配置我可以成功地从parse接收推送。

+0

错字:staff - > stuff –

+0

谢谢@AbAppletic修复 – savepopulation

2

除了权限

有几件事情,引起解析无法正常发送推送通知。解析在详细描述它们方面做得并不出色,但从我对Parse的经验来看,我可以尝试阐明一些并不总是那么明显的东西。

如果您正在检查Parse仪表板并且能够看到您的设备注册,那很好。 然而,您需要确保为该设备注册了deviceToken。如果没有,我几乎可以保证,如果你检查你的推送标签,你会发现推送成功率为0%或不成功。

确保deviceToken正在注册 除了简单的初始化解析,确保您的应用程序的软件包名称匹配,您使用的名称与您的Android清单链接。如果情况并非如此,那肯定是不接受推动的原因。

Intializing解析

private void initializeParse() { 
     Parse.enableLocalDatastore(this); 
     Parse.initialize(this); 
     ParseInstallation.getCurrentInstallation().saveInBackground(); 
     Log.d(LOG_TAG, "Initializing parse with app id: " + getString(R.string.parse_app_id) + " client_key: " + getString(R.string.parse_client_key)); 
} 

监听推

public class ParsePluginReceiver extends ParsePushBroadcastReceiver { 
private static final String TAG = "ParsePluginReceiver"; 
private static final String RECEIVED_IN_FOREGROUND = "receivedInForeground"; 
private static int badgeCount = 0; 
public static final String FORWARD_EXTRA = "FORWARD_ACTIVITY"; 


@Override 
protected void onPushReceive(Context context, Intent intent) { 
    JSONObject pushData = getPushData(intent); 

    if (pushData != null) { 
     Log.d(TAG, "JSON Payload: " + pushData.toString()); 
     super.onPushReceive(context, intent); 
    } 
} 

protected void onPushOpen(Context context, Intent intent) { 
    JSONObject pushData = getPushData(intent); 
    Log.d(TAG, "JSON Payload: " + pushData.toString()); 

    if (pushData != null) { 
     try { 
      super.onPushOpen(context, intent); 
     } catch (Exception ex) { 

     } 
    } 
} 

为参照,解析SDK位于:https://parse.com/docs/android/guide

旁注 解析将于明年年初开始弃用。

2

确保你拥有所有这些权限:

<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.VIBRATE" /> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

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

而你需要所有这些添加到您的清单:

<service android:name="com.parse.PushService" /> 
    <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> 
    <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="your_package_name" /> 
     </intent-filter> 
    </receiver> 

只是一些建议,转移到别的如火力地堡。解析正在关闭。

-1

解析将完全退役。

我从解析邮件中得到邮件说他们要退休了。那么,为什么你要犯的错误将会过期。尝试使用更轻的gsm或插座。