当前位置: 首页 > 知识库问答 >
问题:

如何利用Android牛轧糖的直接回复功能和NotificationListener?

漆雕升
2023-03-14

我的应用程序正在使用notificationlistener读取来自各种第三方应用程序的消息,例如WhatsApp。

到目前为止,我能够发送一个回复,如果只有一个聊天未读,代码如下。

但是,在WhatsApp的情况下,getNotification().actions会在两个以上聊天未读时返回一个空对象,因为消息绑定在一起。正如你在下面的图片中所看到的,如果通知被延长,也有一个选择发送一个直接回复,因此我确信这是可以利用的,而且我认为像PushBullet这样的应用程序正在使用这种方法

我如何访问该通知的RemoteInput?

public static ReplyIntentSender sendReply(StatusBarNotification statusBarNotification, String name) {

            Notification.Action actions[] = statusBarNotification.getNotification().actions;

            for (Notification.Action act : actions) {
                if (act != null && act.getRemoteInputs() != null) {
                    if (act.title.toString().contains(name)) {
                        if (act.getRemoteInputs() != null)
                            return new ReplyIntentSender(act);
                    }
                }
            }
            return null;
        }



public static class ReplyIntentSender {
      [...]

    public final Notification.Action action;

    public ReplyIntentSender(Notification.Action extractedAction) {
            action = extractedAction;
     [...]
    }

private boolean sendNativeIntent(Context context, String message) {
            for (android.app.RemoteInput rem : action.getRemoteInputs()) {
                Intent intent = new Intent();
                Bundle bundle = new Bundle();
                bundle.putCharSequence(rem.getResultKey(), message);
                android.app.RemoteInput.addResultsToIntent(action.getRemoteInputs(), intent, bundle);
                try {
                    action.actionIntent.send(context, 0, intent);
                } catch (Exception e) {
                    e.printStackTrace();
                    return false;
                }
                return true;
            }
            return false;
        }
    }

上面的代码是如何工作的:收到通知后,应用程序尝试获取操作并检查名称是否在remoteInput的标题中(通常是“Reply to$name”的格式),如果找到了,则将操作保存到ReplyIntentSender类中,该类由SendNativeIntent触发时,循环遍历该操作的所有remoteInput并将消息添加到意图中。如果多个聊天未读,getNotification().actions返回NULL。

下面是两个截图,第一个是它工作没有任何问题,第二个是它没有。

共有1个答案

赵献
2023-03-14

你可以把这当作我的建议。我对此做了一些研究,得出了以下结论(看起来你对此做了大量的研究,所以可能你知道我下面写的内容)

许多应用程序会发送特定的Wear通知,其中许多都包含可以从Android Wear设备访问的操作。我们可以在设备上抓取这些磨损通知,提取动作,找到回复动作(如果存在的话),用我们自己的响应填充它,然后执行pendingintent,它将我们的响应发送回原始应用程序,以便发送给收件人。

为此,您可以参考这个链接(Rob J提供的一个很好的解决方法)。您还可以在此上下文中引用此链接(MichaLawTajchert完成的伟大研究工作)。(您可能需要使用notificationcompat.isgroupsummary)

这就是我的感觉(也许我完全错了)

.actions方法返回addAction(int、CharSequence、PendingIntent)附加到当前通知的所有notification.action结构的数组,此处不推荐使用addAction方法,因此它可能无法按预期工作。

我不能测试这在我的结束,否则我将爱提供一个工作的解决方案与代码。

 类似资料:
  • 例外 片段点击:- 在活动中, 详细活动清单, 图像加载使用毕加索, 模型类 从活动到片段的数据流, 我尝试过的解决方案 注意:-应用程序崩溃只在NOUGAT 最后,我实现了修复 将targetSdkVersion从25更改为23 更改后,我的应用程序在牛轧糖也不会崩溃。 我所要知道的就是这个合适的解决方案,或者有什么变通办法。 请引导到正确的方式。 提前谢谢。 碎片 选项卡布局 列表视图

  • 在清单文件中:

  • 我尝试了太多的选项/博客/脚本来安装GooglePlay for Emulator(通过Android Studio运行),但都没有成功。我看到了很多不同的错误 失败[安装失败\u更新不兼容] 评论-为什么在Emulator上安装GooglePlay如此困难,有人能提供与Marshmallow/Noughat一起使用的步骤或GAPP吗。或者为什么谷歌不提供标准步骤来为模拟器安装GApps! 以下是

  • 我的应用程序在之前的Android版本上运行完美,在实际设备上从4.0测试到6.0.1。工作室仿真牛轧糖7.0和7.1没问题。然而,当我让我的朋友在他运行7.0的设备上测试APK时,这在几秒钟内就发生了: 崩溃通知 我没有访问该设备的权限(他住得很远),并且我无法在网上找到该特定错误的任何相关信息。原因可能是什么?

  • 根据我们的客户需求,我们希望在所有Android操作系统版本的DatePickerDialog上保持全息样式,比如:Android 7上的DatePicker- 但在Android 7上似乎不能正常工作: Android 7上的DatePicker