错误〜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 和 iOS 设备
未在 android 中使用 parse.com 获取推送通知