错误〜parse.com推送通知android?

Posted

技术标签:

【中文标题】错误〜parse.com推送通知android?【英文标题】:Error ~ parse.com push notification android? 【发布时间】:2014-12-30 19:18:22 【问题描述】:

我只是在 android 编程中迈出了第一步,我想尝试实现 parse.com 推送通知。我使用 1.8.0 版本。当我测试时,我遇到了下一个错误:

1) Error:(20, 68) error: cannot access Task class file for bolts.Task not found.

2) setDefaultPushCallback 已弃用。

您可以在下面看到我使用的代码。我错过了什么,我需要改变什么?!也许有人有很好的例子?

ParseReceiver.java

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.happy);

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

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

        NotificationManager notification_manager = (NotificationManager)ctx.getSystemService(Context.NOTIFICATION_SERVICE);
        notification_manager.notify(0, notification);
    

ParseApplication.java

public class ParseApplication extends Application 
    @Override
    public void onCreate() 
        super.onCreate();
        Parse.initialize(this, Keys.applicationId, Keys.clientKey);
        PushService.setDefaultPushCallback(this, MainActivity.class);
        ParseInstallation.getCurrentInstallation().saveInBackground();
    


Keys.java

public class Keys 
    protected static final String applicationId = "";
    protected static final String clientKey = "";

在 Manifect 文件中我使用了下一个代码

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

<!-- My custom receiver -->
<receiver android:name=".ParseReceiver" >
<intent-filter>
<action android:name="com.makemyandroidapp.parsenotificationexample.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 -->

【问题讨论】:

【参考方案1】:

1) 您应该检查 Eclipse 项目的 libs 文件夹。可能您缺少最新的 bolts jar 文件。这是包含解析库文件的 zip 的一部分。

2) 不幸的是,官方教程有些误导,因为它们没有完全更新 API 的最新更改。实际上,如果我没记错的话,这在 Parse 1.6 版之前是必要的。 现在,正如您在自定义接收器的代码中看到的那样,您通过设置待处理的意图来设置单击通知时要打开的活动。检查deprecation 的注释。 当前的实现,使用新的ParsePushBroadcastReceiver,比以往更加灵活!因此,不要扩展 BroadcastReceiver,而是扩展这个。请务必阅读有关此的文档。这是非常有帮助的。

还有: a) 在您的清单中,将“我的自定义接收器”的部分替换为以下内容

<receiver android:name=".ParseReceiver" 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>

b) 改变这个

<receiver android:name="com.parse.ParseBroadcastReceiver" >

到您自己的自定义接收器

<receiver android:name="com.makemyandroidapp.parsenotificationexample.ParseReceiver">

c) 在您的清单中,确保使用您创建的 ParseApplication 类作为名称属性:

<application
    android:name=".ParseApplication"
    ....
    ....
 />

我希望以上内容能帮助您继续您的项目。

【讨论】:

@LuckyLuky 你好!当然,在文档中我注意到他们建议将 setDefaultPushCallback 替换为 ParsePushBroadcastReceiver。在这里的一个主题中,我找到了一些信息,但不明白如何正确使用它。你可以检查一下***.com/questions/26154855/…。这是否意味着我需要使用他们的 Receiver.java 而不是 ParseReceiver.java?!事实上,现在对我来说,这是一个很大的混乱,因为我不明白如何处理 PasreApplication.java 以及现在把钥匙放在什么地方。你能解释一下吗? 你自己的接收器类就好了。只需将您的类声明更改为 public class ParseReceiver extends ParsePushBroadcastReceiver 并将 onReceive() 声明替换为 public void onPushOpen(Context ctx, Intent intent) (尽管 onReceive() 可以正常工作)。关于 ParseApplication.java,您是否从解析中获得了应用程序密钥和客户端密钥?如果是这样,将它们应用到 Keys.java 上就可以了。 Here 我引用了整个 AndroidManifest.xml 以方便您检查与您的代码的差异。 我按照你说的做了。我使用公共类 ParseReceiver 扩展 ParsePushBroadcastReceiver 而不是我的旧类,然后将 OnReceive 替换为 onPush 方法并在 Push 打开后添加到打开 MainActivity 。我注意到您的源代码中 Manifect 中的 .ParseReceiver 重复。没事吧?!最后一个我想问的是 ParseApplication.java 中的这一行我有问题 ParseInstallation.getCurrentInstallation().saveInBackground();我需要做什么?!错误和之前一样:cannot access Task class file for bolts.Task not found. Manifest 按原样工作,但请查看this 以获得更视觉优化的版本。您只需要关心最小、目标 sdk 版本和指向您自己的包名称(在清单顶部)。为了克服Task类问题去here,下载SDK(v1.8.0),解压并复制bolts-android-1.1.4.jar,bolts-android-1.1.4.jar.properties,Parse- 1.8.0.jar 和 Parse-1.8.0.jar.properties 到 Eclipse 项目中的 libs 文件夹中。如果没有在项目的顶层创建一个。然后清理并构建。 谢谢@LuckyLuke 现在没有错误,并且 parse.com 服务可以看到我的设备,但是当我发送消息时,我的模拟器设备中没有通知。那是什么原因呢?你对此有什么想法吗?顺便说一句新年快乐! =)

以上是关于错误〜parse.com推送通知android?的主要内容,如果未能解决你的问题,请参考以下文章

Parse.com android - 禁用推送通知

Parse.com 推送通知延迟或仅在 Android 应用重启后

推送通知不适用于通过 Parse.com 发送的 Android 和 iOS 设备

未在 android 中使用 parse.com 获取推送通知

Android,使用 parse.com 推送通知,自动启动应用程序

如何在 Android 中禁用多个推送通知图标,我正在使用 Parse.com