如何使用Espresso与DocumentsProvider结果进行意图测试

7

我的活动需要从文档提供程序请求新的文档。

我想通过使用uri在我的espresso测试中测试此功能。然而,返回的uri没有被授予正确的权限。当我尝试执行takePersistableUriPermission时,至少会出现SecurityException:未找到[user]和[uri]的可保留权限授予

我的活动在onActivityResult中相关的代码:

val takeFlags = data.getFlags() and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
contentResolver.takePersistableUriPermission(it, takeFlags)

浓缩咖啡测试的相关代码

val file = File(InstrumentationRegistry.getTargetContext().filesDir, "abc.txt2)
val uri = Uri.parse("file://" + file.absoluteFile)
Intents.intending(hasAction(Intent.ACTION_CREATE_DOCUMENT))
            .respondWith(Instrumentation.ActivityResult(RESULT_OK, Intent().setData(uri)))
 <click on button to request document>

如何使用授予的权限来启动带有URI的Activity并获得结果?

我需要创建一个FileProvider吗? - friedger
同样的问题。你找到解决方案了吗? - Alexandr Larin
2个回答

0
以下代码对我而言运行良好。
val intent = TestGeneralUtil.genIntentWithPersistedReadPermissionForFile(att)
intending(
    allOf(
        hasAction(Intent.ACTION_CHOOSER),
        hasExtra(`is`(Intent.EXTRA_INTENT),
            allOf(
                hasAction(Intent.ACTION_OPEN_DOCUMENT),
                hasType("*/*"),
                hasCategories(hasItem(equalTo(Intent.CATEGORY_OPENABLE)))
            )
        )
    )
).respondWith(Instrumentation.ActivityResult(Activity.RESULT_OK, intent))

而且

/**
     * Generate an [Intent] with [Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION]
     * and [Intent.FLAG_GRANT_READ_URI_PERMISSION]
     */
    fun genIntentWithPersistedReadPermissionForFile(file: File): Intent {
      return Intent().apply {
        val context: Context = ApplicationProvider.getApplicationContext()
        val uri = FileProvider.getUriForFile(context, Constants.FILE_PROVIDER_AUTHORITY, file)
        context.grantUriPermission(
            BuildConfig.APPLICATION_ID,
            uri,
            Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION)
        data = uri
        flags = Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION
      }
    }

0

使用

val uri = Uri.fromFile(file)

替代

val uri = Uri.parse("file://" + file.absoluteFile)

不要忘记提供权限

@get:Rule
var permissionRule: GrantPermissionRule = GrantPermissionRule.grant(
        android.Manifest.permission.READ_EXTERNAL_STORAGE
)

对于我的情况它有效


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接