Android - 推送通知 - 答案

时间:2017-02-28 22:42:21

标签: android push-notification google-cloud-messaging

许多信使/应用发送Android通知,我可以直接在通知中回复而无需打开应用。 例如,此功能在WhatsApp或Telegram中。

我现在的问题是,怎么做?

//更新:

这是我试过的代码:

// Start Direct 
// Key for the string that's delivered in the action's 
final String KEY_TEXT_REPLY = "ring_direct_reply";
replyLabel = App.getInstance().getResources().getString(R.string.action_reply);
RemoteInput remoteInput = new RemoteInput.Builder(
    .setLabel(replyLabel)
    .build();


PendingIntent chatPendingIntent = PendingIntent.getBroadcast(
    context,
    0,
    new Intent(context, NotificationReceiver.class),
    PendingIntent.FLAG_UPDATE_CURRENT
);

// Create the reply action and add the remote input.
Notification.Action action =
    new Notification.Action.Builder(
        android.R.drawable.ic_delete,
        App.getInstance().getResources().getString(R.string.action_reply),
        chatPendingIntent
    )
    .addRemoteInput(remoteInput)
    .build();
// End Direct Reply


NotificationCompat.Builder mBuilder =
                                new NotificationCompat.Builder(context)
    .setSmallIcon(R.drawable.ic_action_push_notification)
    .setContentTitle(title)
    .setContentText(message)
    .addAction(action)
    .setStyle(new NotificationCompat.BigTextStyle().bigText(message));

Intent resultIntent = new Intent(context, DialogsActivity.class);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
stackBuilder.addParentStack(DialogsActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS);
mBuilder.setAutoCancel(true);
mNotificationManager.notify(0, mBuilder.build());

我有以下两个问题: getting this error

and this error

//更新2:

解决了我的第一个问题后,我遇到了一个新问题:

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

但这可以通过添加Looper.prepare();

来解决

1 个答案:

答案 0 :(得分:2)

有两种方式:

  1. 这就是Hangtous的用法:使用Nougat中引入的回复API。只需遵循官方指南:https://developer.android.com/guide/topics/ui/notifiers/notifications.html#direct

  2. 据我所知,WhatsApp是如何做到的(我不确定电报):创建一个透明背景(在主题中设置)的活动和屏幕顶部的一些内容输入字段和发送按钮。

  3. <强>更新

    现在您展示了一些代码,实际上非常简单。 您正在混合本机API和Compat API。

    • Notification来自包android.app.Notification
    • 中的原生内容
    • NotificationCompat来自包android.support.v4.app.NotificationCompat
    • 中的compat支持库

    你不能混合它们。选择一个并使用那一个。我建议将compat用于所有内容,因为它自动处理向后兼容性。