当API低于26时在Unity中找不到NotificationChannel

时间:2019-04-11 05:58:08

标签: android unity3d

我在我的统一项目中使用的是一个android库,它在通知方面做了一些事情。

库中有一部分代码可以导入android.app.NotificationChannel。就像:

library.setNotificationListener(...)

,它将被引用到一个导入通知通道的Java文件中。

如果我在Android 8.0或更高版本上运行我的应用程序,它可以运行,但是如果我在较低的API(例如25)上对其进行测试,它会显示:

AndroidJavaException: java.lang.NoClassDefFoundError: android.app.NotificationChannel
          java.lang.NoClassDefFoundError: android.app.NotificationChannel
          at com.unity3d.player.ReflectionHelper.getMethodID(Unknown Source)
          at com.unity3d.player.ReflectionHelper.nativeProxyInvoke(Native Method)
          at com.unity3d.player.ReflectionHelper.a(Unknown Source)
          at com.unity3d.player.ReflectionHelper$1.invoke(Unknown Source)

该库在本机应用程序中的较低26位android上正常工作

为什么要在API 26中找到此类,而在较低的API中找不到此类?
该代码处理API版本,并且低于26时不会调用任何android 8.0特定的API。它只是导入一个。

我应该在Unity中为这些情况添加一些配置吗?

3 个答案:

答案 0 :(得分:0)

NotificationChannel(s)为introduced in Android O(API 26)。

我对Unity不太了解,但是在本地Android应用中,我们执行以下操作来设置频道。

private fun setupChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = createNotificationChannel()
        // Register the channel with the system
        val notificationManager = context.getSystemService(NotificationManager::class.java)
        notificationManager?.createNotificationChannel(channel)
    }
}

@RequiresApi(Build.VERSION_CODES.O)
private fun createNotificationChannel() = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT).apply {
    description = channelDescription
}

希望有帮助!

答案 1 :(得分:0)

Android 7.1.1(API 25)及更低版本没有(并且不需要)NotificationChannel。这意味着,如果您在使用低于25的较低api开发的应用中创建了一个通知,那么如果您将此应用安装在api 26(android 8.0)及更高版本上,则不会显示此通知-仅仅是因为他们确实需要它。

答案 2 :(得分:0)

此问题可能在两种情况下发生:

  1. CompileSDKVersion

    如果编译sdk低于26,则该类将不在类路径中,因此您可能最终会收到此错误...

  2. MultiDex 如果像在协程中那样,在MultiDex初始化之前需要该类,则需要使用multidex-config文件将其排除,以排除该类并将该类保留在mainDex中。

    有关更多信息,请查看official docs