代码之家  ›  专栏  ›  技术社区  ›  Para1life

解组时找不到类:com.google.firebase。时间戳,

  •  0
  • Para1life  · 技术社区  · 4 月前

    我正试图使用向另一个活动发送时间戳 intent.putExtra("timeStamp", timeStamp) 然而,在某些版本的android上(通常是旧版本),我收到了以下错误:

    Class not found when unmarshalling: com.google.firebase.Timestamp
    java.lang.ClassNotFoundException: com.google.firebase.Timestamp
    at java.lang.Class.classForName(Native Method)
    at java.lang.Class.forName(Class.java:454)
    at android.os.Parcel.readParcelableCreator(Parcel.java:3338)
    at android.os.Parcel.readParcelable(Parcel.java:3272)
    at android.os.Parcel.readValue(Parcel.java:3174)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:3567)
    at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292)
    at android.os.BaseBundle.unparcel(BaseBundle.java:236)
    at android.os.BaseBundle.getString(BaseBundle.java:1196)
    at m.sm.a(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):42)
    at com.google.android.gms.measurement.internal.AppMeasurementDynamiteService.onActivityCreatedByScionActivityInfo(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):23)
    at m.io.v(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):33)
    at m.bx.onTransact(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):21)
    at android.os.Binder.transact(Binder.java:1052)
    at com.google.android.gms.internal.measurement.zzbu.zzb(com.google.android.gms:play-services-measurement-base@@22.2.0:21)
    at com.google.android.gms.internal.measurement.zzdn.onActivityCreatedByScionActivityInfo(com.google.android.gms:play-services-measurement-base@@22.2.0:123)
    at com.google.android.gms.internal.measurement.zzfq.zza(com.google.android.gms:play-services-measurement-sdk-api@@22.2.0:11)
    at com.google.android.gms.internal.measurement.zzed$zzb.run(com.google.android.gms:play-services-measurement-sdk-api@@22.2.0:12)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:923)
    Caused by: java.lang.ClassNotFoundException: com.google.firebase.Timestamp
    at java.lang.Class.classForName(Native Method)
    at java.lang.BootClassLoader.findClass(ClassLoader.java:1358)
    at java.lang.BootClassLoader.loadClass(ClassLoader.java:1418)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
    at java.lang.Class.classForName(Native Method) 
    at java.lang.Class.forName(Class.java:454) 
    at android.os.Parcel.readParcelableCreator(Parcel.java:3338)                                                                                                        at android.os.Parcel.readParcelable(Parcel.java:3272) 
    at android.os.Parcel.readValue(Parcel.java:3174) 
    at android.os.Parcel.readArrayMapInternal(Parcel.java:3567) 
    at android.os.BaseBundle.initializeFromParcelLocked(BaseBundle.java:292) 
    at android.os.BaseBundle.unparcel(BaseBundle.java:236) 
    at android.os.BaseBundle.getString(BaseBundle.java:1196) 
    at m.sm.a(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):42) 
    at com.google.android.gms.measurement.internal.AppMeasurementDynamiteService.onActivityCreatedByScionActivityInfo(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):23) 
    at m.io.v(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):33) 
    at m.bx.onTransact(:com.google.android.gms.dynamite_measurementdynamite@[email protected] (150400-0):21) 
    at android.os.Binder.transact(Binder.java:1052) 
    at com.google.android.gms.internal.measurement.zzbu.zzb(com.google.android.gms:play-services-measurement-base@@22.2.0:21) 
    at com.google.android.gms.internal.measurement.zzdn.onActivityCreatedByScionActivityInfo(com.google.android.gms:play-services-measurement-base@@22.2.0:123) 
    at com.google.android.gms.internal.measurement.zzfq.zza(com.google.android.gms:play-services-measurement-sdk-api@@22.2.0:11) 
    at com.google.android.gms.internal.measurement.zzed$zzb.run(com.google.android.gms:play-services-measurement-sdk-api@@22.2.0:12) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) 
    at java.lang.Thread.run(Thread.java:923) 
    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
    

    我试图使用一些不同的东西来看看它们是否有效,但它们都不起作用,其中一些甚至在所有版本中都发生了这个错误,或者使使用时间戳的代码完全停止一起工作。以下是我迄今为止尝试过的一些事情:

    尝试1:

    活动1: intent.putExtra(“时间戳”,时间戳)

    活动2:

    val timeStamp = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                    intent.getParcelableExtra("timeStamp", Timestamp::class.java)
                } else {
                    intent.getParcelableExtra<Timestamp>("timeStamp")
                }
    

    尝试2:

    活动1: intent.putExtra(“时间戳”,时间戳)

    活动2:

    intent.setExtrasClassLoader(Timestamp::class.java.classLoader)
    val timeStamp = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
                    intent.getParcelableExtra("timeStamp", Timestamp::class.java)
                } else {
                    intent.getParcelableExtra<Timestamp>("timeStamp")
                }
    

    尝试3:

    活动1:

    intent.setExtrasClassLoader(Timestamp::class.java.classLoader)
    intent.putExtra("timeStamp", timeStamp)
    

    活动2:

    val时间戳=if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.TIRAMISU){
    intent.getParcelableExtra(“时间戳”,时间戳::class.java)
    }其他{
    intent.getParcelableExtra<时间戳>(“时间戳”)
    }
    

    尝试4(由于时间戳不起作用,我尝试了Longs并将其转换回来):

    活动1: intent.putExtra("timeStampLong", claim.sentTime.seconds)

    活动2:

    val timeStampLong = intent.getLongExtra("timeStampLong", -1L)
    val timeStamp = Timestamp(Date(timeStampLong))
    

    虽然尝试4最初似乎有效,但时间戳似乎转换不正确(我在代码的其他地方使用了类似的转换,它工作得很好),因为当我尝试使用时间戳时,它什么也不做

    1 回复  |  直到 4 月前
        1
  •  1
  •   Doug Stevenson    4 月前

    尝试4应该有效,因为它只是管理java本机long,但你没有正确地完成它。

    首先,时间戳具有 里面是数字,不是一个。如果你想要同样的 Timestamp 对象反序列化后,您需要

    1. 将两者序列化 seconds nanoseconds 将值放入Bundle
    2. 将Bundle另一侧的两个数字反序列化
    3. 将这两个数字传递给 Timestamp constructor 这需要两个值。使用java Date object 不会按照您使用的方式工作( Date constructor 使用单个long值以毫秒为单位,而不是以秒为单位),因此将失去原始的纳秒精度。
    val seconds = intent.getLongExtra("timeStampSeconds", -1L)
    val nanoseconds = intent.getLongExtra("timeStampNanoseconds", -1L)
    val t = Timestamp(seconds, nanoseconds)