【问题标题】:androidTest: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntentandroidTest:针对 S+(版本 31 及以上)要求在创建 PendingIntent 时指定 FLAG_IMMUTABLE 或 FLAG_MUTABLE 之一
【发布时间】:2023-01-30 22:10:51
【问题描述】:

我正在尝试在 androidTest 源集中运行 launchFragmentInHiltContainer。 在代码片段下方运行会导致标题中提到的错误。

@Test
fun mainActivityTest(){
    val scenario = launchFragmentInHiltContainer<CoinInfoFragment> {  }
}

函数 launchFragmentInHiltContainer:

@ExperimentalCoroutinesApi
inline fun <reified T : Fragment> launchFragmentInHiltContainer(
    fragmentArgs: Bundle? = null,
    themeResId: Int = androidx.fragment.testing.R.style.FragmentScenarioEmptyFragmentActivityTheme,
    fragmentFactory: FragmentFactory? = null,
    crossinline action: T.() -> Unit = {}
) {
    val mainActivityIntent = Intent.makeMainActivity(
        ComponentName(
            ApplicationProvider.getApplicationContext(),
            HiltTestActivity::class.java
        )
    ).putExtra(FragmentScenario.EmptyFragmentActivity.THEME_EXTRAS_BUNDLE_KEY, themeResId)

    ActivityScenario.launch<HiltTestActivity>(mainActivityIntent).onActivity { activity ->
        fragmentFactory?.let {
            activity.supportFragmentManager.fragmentFactory = it
        }
        val fragment = activity.supportFragmentManager.fragmentFactory.instantiate(
            Preconditions.checkNotNull(T::class.java.classLoader),
            T::class.java.name
        )
        fragment.arguments = fragmentArgs

        activity.supportFragmentManager.beginTransaction()
            .add(android.R.id.content, fragment, "")
            .commitNow()

        (fragment as T).action()
    }

}

我试图通过以下解决方案解决问题:

  • Android Lint:关闭 Missing PendingIntent 可变性,
  • 添加:
    // Kotlin + coroutines
    implementation "androidx.work:work-runtime-ktx:$work_version"

    // optional - Test helpers
    androidTestImplementation "androidx.work:work-testing:$work_version"

错误堆栈跟踪:

java.lang.IllegalArgumentException: com.example.cointracker: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent.
Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles.
    at android.app.PendingIntent.checkFlags(PendingIntent.java:375)
    at android.app.PendingIntent.getActivityAsUser(PendingIntent.java:458)
    at android.app.PendingIntent.getActivity(PendingIntent.java:444)
    at android.app.PendingIntent.getActivity(PendingIntent.java:408)
    at androidx.test.core.app.InstrumentationActivityInvoker.startActivity(InstrumentationActivityInvoker.java:406)
    at androidx.test.core.app.InstrumentationActivityInvoker.startActivity(InstrumentationActivityInvoker.java:416)
    at androidx.test.core.app.ActivityScenario.launchInternal(ActivityScenario.java:265)
    at androidx.test.core.app.ActivityScenario.launch(ActivityScenario.java:226)
    at com.example.cointracker.presentation.CoinsFragmentTest.mainActivityTest(CoinsFragmentTest.kt:116)

没有任何帮助。有谁知道如何解决这个错误?

【问题讨论】:

  • PendingIntent 在您的代码中的何处初始化?你能提供吗?
  • 这是一个很好的问题,错误即将出现在 inlineFunction 中的 ActivityScenario。我编辑了问题并添加了错误堆栈跟踪。

标签: android android-testing android-pendingintent android-fragmentscenario


【解决方案1】:

更新测试.ext 添加行 androidTestImplementation 'androidx.test.ext:junit:1.1.3' 如果不存在

【讨论】:

    猜你喜欢
    • 2023-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 2022-10-05
    • 2022-01-08
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多