我观察了 Cordova PushPlugin 添加到 android 平台项目的 java 代码,查看文件“GCMIntentService”。在“onMessage”函数中,我看到了这个——
if (PushPlugin.isInForeground()) {
extras.putBoolean("foreground", true);
PushPlugin.sendExtras(extras);
}
else {
extras.putBoolean("foreground", false);
// Send a notification if there is a message
if (extras.getString("message") != null && extras.getString("message").length() != 0) {
createNotification(context, extras);
}
}
然后就很清楚了,看到这条线了PushPlugin.sendExtras(extras)
吗?这是在 javascript webview 端触发代码的行。正如您可能已经注意到的那样,问题在于只有在 app isInForeground()
.
起初,我想我应该在else
块内添加这条线,就在 line 的正下方extras.putBoolean("foreground", false)
,但这只会在应用程序实际上处于后台的情况下有所帮助,如果应用程序根本没有运行,它就无济于事。
出于上述原因,我将简单地用 Java 代码播放音频文件,就像这样(经过测试和工作)-
if (PushPlugin.isInForeground()) {
extras.putBoolean("foreground", true);
PushPlugin.sendExtras(extras);
}
else {
extras.putBoolean("foreground", false);
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.mytone);
mediaPlayer.start();
// Send a notification if there is a message
if (extras.getString("message") != null && extras.getString("message").length() != 0) {
createNotification(context, extras);
}
}
它可以工作,但它不是一个完美的解决方案,我宁愿在后台处理通知或在我的 web 视图中的 JAVASCRIPT 代码中销毁通知,而不是在 Java 中。希望这个功能将被添加到 PushPlugin 中。
也许至少他们可以为“soundname”添加一个参数,以便在他们的调用中播放createNotification(Context context, Bundle extras)
,这对于我使用这个插件来说也是一个足够好的解决方案。
澄清:
我使用以下代码播放通知声音文件名:
String soundName = extras.getString("soundname");
AssetFileDescriptor afd = getAssets().openFd(soundName);
MediaPlayer player = new MediaPlayer();
player.setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());
player.prepare();
player.start();
在服务器端,我会在发送 Android 时传递一个如下所示的 JSON(iOS 有不同的键):
{
...
soundname: 'www/res/raw/yoursoundfile.mp3'
...
}