Acra:如何从继承自 ReportSenderFactory 的自定义 class 检索令牌

Acra: How to retrieve a token from a custom class inheriting from ReportSenderFactory

我有一个在我的一项活动中生成的令牌,我希望在执行 sendHttpRequests 时能够从我的 HttpSender 检索它。

问题是我总是以空令牌结束...发生崩溃时会触发 sendHttpRequests() 方法。

(我是 Acra 的初学者)

@AcraCore(reportSenderFactoryClasses = [SenderFactory::class])
class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()
        ACRA.init(this)
    }
}
class SenderFactory : ReportSenderFactory {

    override fun create(context: Context, config: CoreConfiguration): ReportSender = AcraSender(config)
}

class AcraSender(
    config: CoreConfiguration,
    method: Method = POST,
    type: StringFormat? = null
) : HttpSender(config, method, type) {

    override fun sendHttpRequests(
        configuration: CoreConfiguration,
        context: Context,
        method: Method,
        contentType: String,
        login: String?,
        password: String?,
        connectionTimeOut: Int,
        socketTimeOut: Int,
        headers: Map<String, String>?,
        content: String,
        url: URL,
        attachments: MutableList<Uri>
    ) {

        //I want to retrieve my TOKEN here
    }
}

根据您的要求,有几种解决方案:

  • 如果您希望您的令牌成为报告的一部分,请使用 ErrorReporter.putCustomData,使用
  • ReportSender.send 中检索它
((JSONObject)report.get(ReportField.CUSTOM_DATA.name())).optString("YOUR_KEY")
  • 如果您的令牌是在没有用户交互的情况下生成的,只需在 ReportSender 中生成即可。
  • 否则,使用任何永久存储,如 SharedPreferences 或普通文件。

背景资料:

Acra 在一个单独的进程中运行 ReportSenders(因为崩溃后死掉的进程不是处理网络问题的好地方)。

这意味着大多数内存存储不能用于在应用和 ReportSender 之间共享数据。

ErrorReporter.putCustomData 有效,因为报告是临时保存到磁盘上的。