我在我的统一项目中使用的是一个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中为这些情况添加一些配置吗?
答案 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)
此问题可能在两种情况下发生:
CompileSDKVersion
如果编译sdk低于26,则该类将不在类路径中,因此您可能最终会收到此错误...
MultiDex
如果像在协程中那样,在MultiDex初始化之前需要该类,则需要使用multidex-config
文件将其排除,以排除该类并将该类保留在mainDex中。
有关更多信息,请查看official docs。