6

我的活动需要向文档提供者请求新文档。

我想在我的浓缩咖啡测试中通过使用 uri 来确定活动结果来对此进行测试。但是,返回的 uri 没有授予正确的权限。至少SecurityException: No persistable permission grants found for [user] and [uri]当我尝试takePersistableUriPermission

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

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

espresso 测试的相关代码

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来意图活动结果?

4

2 回答 2

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
)

它适用于我的情况

于 2020-01-13T15:23:34.710 回答
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
      }
    }
于 2021-04-01T07:34:09.410 回答