Parse.com - Android自定义推送通知声音

14

我知道在Android中推送通知声音可以自定义(在iOS上已经支持)。

然而,我没有在文档中看到任何相关参考,只有针对iOS的自定义声音。

我在Parse.com论坛上看到有人一年前请求这样的功能,并得到回答说“正在讨论中”。

有关此事的任何更新吗?如果没有“官方”支持,是否有任何已知的解决方法来使其工作?


你有没有得到这个问题的答案?我也遇到了同样的问题。 - Manikandan
3个回答

11

我找到了一个解决方法。虽然 Parse 的 API 还没有提供这个功能,但是他们有文档来解释如何扩展 ParsePushBroadcastReceiver。

因此,创建一个类来扩展 ParsePushBroadcastReceiver,然后在 onReceive 中调用 generateNotification 方法,并编写自定义代码以创建自己的自定义通知。这样,您可以包含一个声音。首先,您需要将新的声音文件(例如 mp3)添加到资源 / res 文件夹中的 raw 目录中。

顺便说一下,不要忘记更改清单中的 ParsePushBroadcastReceiver 接收器以反映您的新文件。例如:

    <receiver android:name="com.parse.ParsePushBroadcastReceiver"
        android:exported="false">

    <receiver android:name="com.*my_package_name*.MyBroadcastReceiver"
        android:exported="false">

这是我的代码,它能够正常工作且可重复使用。

public class MyBroadcastReceiver extends ParsePushBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    try {
        String jsonData = intent.getExtras().getString("com.parse.Data");
        JSONObject json = new JSONObject(jsonData);

        String title = null;
        if(json.has("title")) {
            title = json.getString("title");
        }

        String message = null;
        if(json.has("alert")) {
            message = json.getString("alert");
        }

        if(message != null) {
            generateNotification(context, title, message);
        }
    } catch(Exception e) {
        Log.e("NOTIF ERROR", e.toString());
    }
}


private void generateNotification(Context context, String title, String message) {
    Intent intent = new Intent(context, MainActivity.class);
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, 0);

    NotificationManager mNotifM = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

    if(title == null) {
        title = context.getResources().getString(R.string.app_name);
    }

    final NotificationCompat.Builder mBuilder =
            new NotificationCompat.Builder(context)
                    .setSmallIcon(R.drawable.icon)
                    .setContentTitle(title)
                    .setContentText(message)
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .bigText(message))
                    .addAction(0, "View", contentIntent)
                    .setAutoCancel(true)
                    .setDefaults(new NotificationCompat().DEFAULT_VIBRATE)
                    .setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.whistle));

    mBuilder.setContentIntent(contentIntent);

    mNotifM.notify(NOTIFICATION_ID, mBuilder.build());
}
}

1
那个 NOTIFICATION_ID 可以是任何整数。通常情况下,它被用于在通知被呈现后管理该通知。在这种情况下,设置任何整数或生成的随机数即可。 - ChrisBorg
这应该是被接受的答案,它精确而且可重复使用。 - Joel
我正在使用PHP API发送Android Parse推送通知,那么应该怎么做? - Mohini
@Mohini 我相信自定义声音仍然需要通过应用程序本身实现,而不能通过 API 完成。 - ChrisBorg
@ChrisBorg,谢谢你提供的代码,我节省了时间,它很有效。 - Mohini
显示剩余2条评论

1
在这个教程的结尾处,解释了如何在推送通知中播放自定义声音。
使用以下代码行进行操作:
 notification.sound = Uri.parse("android.resource://" + context.getPackageName() + "your_sound_file_name.mp3");

1
另一种无需生成自己的通知声音的选择是将声音添加到 Parse 已经为您创建的通知中,如下所示:
public class MyParsePushBroadcastReceiver extends ParsePushBroadcastReceiver {

   @Override
    protected Notification getNotification(Context context, Intent intent) {
        Notification n = super.getNotification(context, intent);
        n.sound = Uri.parse("android.resource://" + context.getPackageName() + "/some_sound.mp3");
        return n;
    }
}

这是我自己想出来的答案,很高兴看到有人发布了一个可行的解决方案。不幸的是,在我的LG G3上运行Lollipop(5.0.1)时,我仍然听到默认的声音。有什么想法吗? - mbm29414

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接