【问题标题】:Android wear crashes on notificationAndroid Wear 在通知时崩溃
【发布时间】:2014-07-12 11:08:06
【问题描述】:

我正在尝试仅在 Android Wear 手表上显示通知。我不希望通知显示在手机上(它在其上打开了应用程序),并且我不希望它直接在 Activity 中(但是,其中一个操作应该打开 Activity)。

为了完成我想要的,我创建了一个带有 onDataChanged 的​​ WearableListenerService。在此方法中,我尝试创建通知。这是我使用的代码: @覆盖 公共无效 onDataChanged(DataEventBuffer 数据事件){ Log.d("Listener", "dataChanged");

    Intent actionIntent = new Intent(getBaseContext(), WatchMainActivity.class);
    actionIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    PendingIntent actionPendingIntent =
            PendingIntent.getActivity(getBaseContext(), 0, actionIntent,
                    PendingIntent.FLAG_CANCEL_CURRENT);

    NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
    NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());

    Log.d("listener", "Created things");

    builder.setContentTitle("Wearable test")
            .setContentText("Testing 123")
            .setOngoing(true)
            .setSmallIcon(R.drawable.ic_launcher)
    ;

    // Create the action
    NotificationCompat.Action action =
            new NotificationCompat.Action.Builder(R.drawable.ic_full_sad,
                    getString(R.string.label), actionPendingIntent)
                    .build();


    NotificationCompat.WearableExtender extender = new NotificationCompat.WearableExtender();
    extender.addAction(action)
            .setContentAction(0)
            .setHintHideIcon(true)
    ;

    Log.d("listener", "action created, extending...");

    builder.extend(extender);

    Log.d("listener", "extended");


    manager.cancel(101);
    Log.d("listener", "canceled");

    manager.notify(101, builder.build());

    Log.d("listener", "notified");


    Log.d("listener", "created");
}

当查看日志时,它会导致崩溃:

D/listener( 1075): listener created
D/Listener( 1075): dataChanged
D/listener( 1075): Created things
D/listener( 1075): action created, extending...
D/listener( 1075): extended
D/listener( 1075): canceled
W/dalvikvm(  597): threadid=20: thread exiting with uncaught exception (group=0xada2fd70)
E/AndroidRuntime(  597): FATAL EXCEPTION: NotificationCollectorService
E/AndroidRuntime(  597): Process: com.google.android.wearable.app, PID: 597
E/AndroidRuntime(  597): java.lang.ClassCastException: android.os.Bundle cannot be cast to android.app.Notification$Action
E/AndroidRuntime(  597):    at android.support.v4.app.NotificationCompatApi20.getActionsFromParcelableArrayList(NotificationCompatApi20.java:145)
E/AndroidRuntime(  597):    at android.support.v4.app.NotificationCompat$NotificationCompatImplApi20.getActionsFromParcelableArrayList(NotificationCompat.java:532)
E/AndroidRuntime(  597):    at android.support.v4.app.NotificationCompat$WearableExtender.<init>(NotificationCompat.java:1876)
E/AndroidRuntime(  597):    at com.google.android.clockwork.stream.StreamManager.stripRemoteViewsFromNotification(StreamManager.java:481)
E/AndroidRuntime(  597):    at com.google.android.clockwork.stream.StreamManager.maybeStripRemoteViewsFromNotification(StreamManager.java:473)
E/AndroidRuntime(  597):    at com.google.android.clockwork.stream.StreamManager.setItem(StreamManager.java:347)
E/AndroidRuntime(  597):    at com.google.android.clockwork.stream.StreamManager.onNotificationPosted(StreamManager.java:253)
E/AndroidRuntime(  597):    at com.google.android.clockwork.stream.NotificationCollectorService$ServiceHandler.handleMessage(NotificationCollectorService.java:264)
E/AndroidRuntime(  597):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(  597):    at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime(  597):    at android.os.HandlerThread.run(HandlerThread.java:61)
D/listener( 1075): notified
D/listener( 1075): created

因此,通知中存在导致此崩溃的某些内容。当我在构建器中删除扩展调用时,它工作正常,但是当然没有添加该操作。因此,我假设我在 Intent/PendingIntent 或 WearableExtender 中做错了什么,但我不知道我做错了什么。当我从磨损文档中获取示例时,它会导致同样的崩溃。

有人知道如何解决这个崩溃问题吗?

【问题讨论】:

    标签: android wear-os android-wear-data-api


    【解决方案1】:

    我刚刚测试了您在 DataLayerListenerService(扩展 WearableListenerService)内的 onDataChanged 回调中发布的代码。 但是...一切正常... 我只将操作标题中的字符串更改为我的 R.string.app_name + 活动名称。除此之外 - 没有任何变化。

    1. 尝试在 Action buider 中将您的 actionPendingIntent 替换为 null(以消除 Intent 和 PendingIntent),并将您的 getString 替换为仅用于测试的硬编码字符串。
    2. 您确定您拥有最新的 Support-v4 库吗?检查您是否有任何关于 AndroidWear 图像、支持库等的内容不是最新的。
    3. 尝试使用标准通知 API 而不是 NotificationCompat - 无需在 Watch 上使用 NotificationCompat:

    http://developer.android.com/training/wearables/apps/creating.html

    对于仅出现在可穿戴设备上的通知(意思是,它们是 由在可穿戴设备上运行的应用程序发布),您只需使用 可穿戴设备上的标准框架 API(API 级别 20)并移除 在项目的移动模块中支持库依赖。

    http://developer.android.com/training/wearables/apps/layouts.html

    注意:在可穿戴设备上创建自定义通知时,您可以使用 标准通知 API(API 级别 20)而不是支持 图书馆。

    请尝试这些步骤,尤其是切换到标准通知而不是 NotificationCompat - 但是您的代码在我的应用程序中运行时被复制,没有任何问题:\

    【讨论】:

    • 我切换到标准 API,这似乎确实可以解决它。不知道是什么导致了这个问题,但我想这现在解决了我的问题。谢谢!
    • 很高兴我能帮上忙,但请问为什么我的回答没有被接受?我自己测试了您发布的整个代码,一切正常。正如我所说,这个问题可能是由您的配置或错误的库版本引起的(您说“当我从磨损文档中获取示例时,它会导致同样的崩溃。”)。我还为您的问题提供了明确的解决方案(“如何解决此崩溃?”)-您承认它帮助了您并解决了您遇到的问题。现在它没有被接受?我很困惑……我的回答有什么问题吗?
    【解决方案2】:

    切换到标准的 4.4W API 可以解决这个问题,当你使用 support.v4 包时,进程 com.google.android.wearable.app 会崩溃。 使用 support.v4 包,如果您不想在通知中添加 RemoteInput,可以使用 build.addAction(action) 而不是 build.extend(extender.addAction(action)) 添加操作

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多