gpt4 book ai didi

java - 通知 DeleteIntent 在更高版本的 Android 上被破坏

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:59:51 27 4
gpt4 key购买 nike

在我们的应用 OneBusAway Android (open-source on Github) 中,我们需要在用户关闭特定提醒通知时收到通知,因此我们不会为同一事件发布另一个提醒通知(他们的巴士到达还有多长时间)。

我们通过监听 Intent 来做到这一点。在我们的应用程序中,注册为 DeleteIntentNotification .当用户关闭通知时(通过滑动它,或点击通知窗口中的清除按钮),我们的应用程序应该收到 Intent .

从测试来看,似乎与 the current version on Google Play (和 current master branch on Github ),在以下 Android 版本中,我们的应用程序永远不会收到 DeleteIntent:

  • 安卓 4.4.3
  • 安卓 4.4.4

  • 但是,完全相同的代码 确实 工作(即,应用程序接收注册为 DeleteIntent 的 Intent):
  • 安卓2.3.3
  • 安卓 2.3.6
  • 安卓4.1.1
  • 安卓4.1.2

  • 我查看了以下处理 DeleteIntent 的 SO 帖子,列出的解决方案均不适用于 Android 4.4.3 和 4.4.4:
  • Notification Auto-Cancel does not call DeleteIntent
  • Android - DeleteIntent, how to use?
  • Notification deleteIntent does not work
  • https://stackoverflow.com/questions/24218626/how-to-detect-notification-cancel-event-in-android-not-deleteintent
  • https://stackoverflow.com/questions/22769523/why-my-deleteintent-is-not-working-on-my-notification
  • Android deleteIntent not working? What's wrong with my code?
  • Custom actions using implicit intents between applications

  • 当前工作的 master 分支使用一个 Service 来监听 Intent。然而,基于上面的一些帖子,我确实调整了一些代码,使其更符合使用 BroadcastReceiver 来监听 Intent 的工作示例。

    使用 BroadcastReceiver 的代码位于以下 Github 分支中:

    https://github.com/CUTR-at-USF/onebusaway-android/tree/issue104-RepeatingReminders

    以下是我当前版本的摘录(仍然适用于 Android 4.1.2 及更低版本,但不适用于 4.4.3 或 4.4.4),以及指向 Github 源的链接:

    创建通知

    https://github.com/CUTR-at-USF/onebusaway-android/blob/issue104-RepeatingReminders/onebusaway-android/src/main/java/com/joulespersecond/seattlebusbot/tripservice/NotifierTask.java#L131
    private Notification createNotification(Uri alertUri) {
    //Log.d(TAG, "Creating notification for alert: " + alertUri);
    Intent deleteIntent = new Intent(mContext, AlarmReceiver.class);
    deleteIntent.setAction(TripService.ACTION_CANCEL);
    deleteIntent.setData(alertUri);

    return new NotificationCompat.Builder(mContext)
    .setSmallIcon(R.drawable.ic_stat_notification)
    .setDefaults(Notification.DEFAULT_ALL)
    .setOnlyAlertOnce(true)
    .setDeleteIntent(PendingIntent.getBroadcast(mContext, 0,
    deleteIntent, PendingIntent.FLAG_UPDATE_CURRENT))
    .setAutoCancel(true)
    .build();
    }

    标题和其他动态通知信息在几行之后设置(如果通知仍未解除,则稍后重置):
    @SuppressWarnings("deprecation")
    private void setLatestInfo(Notification notification,
    String stopId,
    String routeId,
    long timeDiff) {
    final String title = mContext.getString(R.string.app_name);

    final PendingIntent intent = PendingIntent.getActivity(mContext, 0,
    new ArrivalsListActivity.Builder(mContext, stopId).getIntent(),
    PendingIntent.FLAG_UPDATE_CURRENT);

    notification.setLatestEventInfo(mContext,
    title,
    getNotifyText(routeId, timeDiff),
    intent);
    }

    TripService 包含 Action 的常量:
    public static final String ACTION_CANCEL =
    "com.joulespersecond.seattlebusbot.action.CANCEL";

    报警接收器

    https://github.com/CUTR-at-USF/onebusaway-android/blob/issue104-RepeatingReminders/onebusaway-android/src/main/java/com/joulespersecond/seattlebusbot/AlarmReceiver.java
    public class AlarmReceiver extends BroadcastReceiver {

    private static final String TAG = "AlarmReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
    Log.d(TAG, "In onReceive with intent action " + intent.getAction());
    ...
    }
    }

    AndroidManifest

    https://github.com/CUTR-at-USF/onebusaway-android/blob/issue104-RepeatingReminders/onebusaway-android/src/main/AndroidManifest.xml
    <receiver android:name=".AlarmReceiver">
    <!-- These action names must match the constants in TripService -->
    <intent-filter>
    <action android:name="com.joulespersecond.seattlebusbot.action.SCHEDULE" />
    <action android:name="com.joulespersecond.seattlebusbot.action.POLL" />
    <action android:name="com.joulespersecond.seattlebusbot.action.CANCEL" />
    </intent-filter>
    </receiver>

    如上所述,在 Android 4.4.3/4.4.4 上,当用户关闭通知时,AlarmReceiver 永远不会看到 Intent。

    我还尝试添加一个 MIME 类型,如 Custom actions using implicit intents between applications 中指定的那样。 ,但这在 Android 4.4.3/4.4.4 上也不起作用:
    Intent deleteIntent = new Intent(mContext, AlarmReceiver.class);
    deleteIntent.setAction(TripService.ACTION_CANCEL);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    deleteIntent.setDataAndTypeAndNormalize(alertUri, TripService.REMINDER_MIME_TYPE);
    } else {
    deleteIntent.setDataAndType(alertUri, TripService.REMINDER_MIME_TYPE);
    }

    return new NotificationCompat.Builder(mContext)
    .setSmallIcon(R.drawable.ic_stat_notification)
    .setDefaults(Notification.DEFAULT_ALL)
    .setOnlyAlertOnce(true)
    .setDeleteIntent(PendingIntent.getBroadcast(mContext, 0,
    deleteIntent, 0))
    //.setLights(0xFF00FF00, 1000, 1000)
    //.setVibrate(VIBRATE_PATTERN)
    .build();
    REMINDER_MIME_TYPEapplication/vnd.com.joulespersecond.seattlebusbot.reminder
    使用 MIME 类型的 list :
    <receiver android:name=".AlarmReceiver">
    <!-- These action names must match the constants in TripService -->
    <intent-filter>
    <action android:name="com.joulespersecond.seattlebusbot.action.SCHEDULE" />
    <action android:name="com.joulespersecond.seattlebusbot.action.POLL" />
    <action android:name="com.joulespersecond.seattlebusbot.action.CANCEL" />

    <data android:mimeType="application/vnd.com.joulespersecond.seattlebusbot.reminder" />
    </intent-filter>
    </receiver>

    我也试过 不是 使用支持库(即使用 Notification.Builder 而不是 NotificationCompat.Builder ),但这也没有改变任何东西。

    任何想法为什么这不适用于 Android 4.4.3/4.4.4?

    更多信息显示在 Github issue对于这个问题。

    编辑

    我还在一个小型 Github 项目“DeleteIntentDemo”中复制了这个问题:

    https://github.com/barbeau/DeleteIntentDemo

    重现说明在该项目的自述文件中。

    编辑 2

    这似乎是由于 Notification.setLatestEventInfo() 中的 Android 错误造成的。 - 我在这里报告过:
    https://code.google.com/p/android/issues/detail?id=73720

    有关解决方法,请参阅@CommonsWare 的答案。

    编辑 3

    我修复此问题的 AOSP 补丁现已合并,因此在 future 的 Android 版本中,旧版应用不会出现此问题:
    https://code.google.com/p/android/issues/detail?id=73720#c4

    但是,在上面的 AOSP 线程中,强调不应再使用 Notification.setLatestEventInfo()。 - 改为使用 Notification.Builder创建一个新的通知。

    最佳答案

    在您的示例项目中,如果删除以下行,deleteIntent适用于运行 4.4.4 的 Nexus 4:

    setLatestInfo(getActivity(), notification, routeId);

    我怀疑这个电话正在消灭你的 deleteIntent .重新申请您的 deleteIntent 可能会起作用到 Notification作为您的 setLatestInfo() 的一部分加工。

    关于java - 通知 DeleteIntent 在更高版本的 Android 上被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24769228/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com