我目前正在将移动应用程序从传统的 Activity/XML 方法迁移到 Jetpack Compose。作为此次迁移的一部分,我面临着集成华为应用内购买服务的挑战。
华为内购SDK(自2023年起未更新)需要使用
Status.startResolutionForResult(Activity activity, int requestCode)
发起内购,并在Activity的onActivityResult
方法中处理结果。
鉴于 Jetpack Compose 提倡单活动架构,我正在探索直接在可组合函数中处理结果的方法。我尝试将
rememberLauncherForActivityResult
与 ActivityResultContracts.StartActivityForResult
合约一起使用:
val iapStatusForResult = rememberLauncherForActivityResult(ActivityResultContracts.StartActivityForResult()) {
}
但是,
iapStatusForResult.launch
方法需要 Intent
作为输入。不幸的是, Status.startResolutionForResult
方法不会返回 Intent
,而是使用提供的 startActivityForResult
实例直接在内部启动 startIntentSenderForResult
或 Activity
方法。
注意此类内部使用的意图是私有字段。
我现在想到的唯一解决方案是使用反射来修改
Intent
类中 Status
字段的可见性,以直接访问它并在我的可组合项中使用它。
这是一个不太理想的解决方案,因为它潜在的脆弱性和对内部实施细节的依赖。
我愿意接受可能更适合处理这种特定情况的建议和替代方法。任何见解或解决方法将不胜感激。
探索 SDK 中的
Status
类,我发现公开了两种方法来检索内部使用的 intent
和 pendingIntent
字段,以便在应用内购买中启动。
所以使用它时,我只需要根据情况使用
startResolutionForResult
函数配合rememberLauncherForActivityResult
合约或者ActivityResultContracts.StartActivityForResult()
来重新实现SDK的ActivityResultContracts.StartIntentSenderForResult()
方法的逻辑即可。