Android 如何为计划的操作树创建内容Uri

Android 如何为计划的操作树创建内容Uri,android,android-intent,android-espresso,android-testing,Android,Android Intent,Android Espresso,Android Testing,我尝试编写一个Android Instrumentation测试,用户必须选择一个文件夹来保存一些文件。 但我不知道如何创建意图所需的结果 下面的代码是我一直想到的 val testUri = Uri.parse("content://com.android.providers.downloads.documents/tree/downloads") val openDocumentTreeResult = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE

我尝试编写一个Android Instrumentation测试,用户必须选择一个文件夹来保存一些文件。 但我不知道如何创建意图所需的结果

下面的代码是我一直想到的

val testUri = Uri.parse("content://com.android.providers.downloads.documents/tree/downloads")
val openDocumentTreeResult = 
    Intent(Intent.ACTION_OPEN_DOCUMENT_TREE, testUri)

openDocumentTreeResult.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION and Intent.FLAG_GRANT_WRITE_URI_PERMISSION)

intending(hasAction(Intent.ACTION_OPEN_DOCUMENT_TREE))
    .respondWith(
        Instrumentation.ActivityResult(Activity.RESULT_OK, openDocumentTreeResult
     )
)

当然,使用Uri.parse创建内容Uri有点幼稚。在日志中,我有以下警告,可能是由DocumentFile.fromTreeUri使用上述原始Uri引起的:

W/DocumentFile: Failed query: java.lang.SecurityException: 
Permission Denial: opening provider com.android.providers.downloads.DownloadStorageProvider from ProcessRecord{edb1c64 4157:xyz.com.abc/u0a87} (pid=4157, uid=10087) 
requires that you obtain access using ACTION_OPEN_DOCUMENT or related APIs
稍后,DocumentFile.createFile会失败,因为它给了我一个空值。相应的代码:

val treeUri = intent.data
val pickedDir = DocumentFile.fromTreeUri(this, treeUri)
val target = pickedDir.createFile(mimetype, f.name)
当我首先手动测试这个场景时,测试运行时不会出错。我猜是因为我的应用程序已经拥有下载目录的权限了


如何创建包含必要权限的意向结果。

如果要返回希望DocumentFile能够使用的Uri,该Uri必须有效。它需要指向一个ContentProvider:

存在 符合DocumentFile将调用的DocumentsContract API,或至少符合测试所需的部分 返回测试所需的内容
在权限方面。。。理想情况下,您的测试提供商不需要任何测试,只是为了简化问题。如果这是不切实际的,您可以尝试在您的意图上添加标志来授予您所需的权限,例如,FLAG_grant_READ_URI_权限,尽管我不知道这在您的浓缩咖啡测试场景中效果如何。

如果您要返回希望DocumentFile能够使用的URI,则URI必须工作。它需要指向一个ContentProvider:

存在 符合DocumentFile将调用的DocumentsContract API,或至少符合测试所需的部分 返回测试所需的内容
在权限方面。。。理想情况下,您的测试提供商不需要任何测试,只是为了简化问题。如果这是不切实际的,您可以尝试在您的意图上添加标志来授予您所需的权限,例如,FLAG_grant_READ_URI_权限,尽管我不知道这在您的浓缩咖啡测试场景中的效果如何。

当然,使用URI.parse有点幼稚,会导致一个警告-您不应该从URI.parse本身获得该消息。不过,使用该Uri的某些东西可能会向您提供该消息。如何创建包含necessray权限的意向结果-如果希望DocumentFile上的createFile正常工作,您需要使用您控制的Uri与实现DocumentsContract的提供程序联系。@Commonware警告不是来自Uri.parse,这是我写错的。我猜它来自DocumentFile.fromtreeeuri。我更新了这个问题。当然,Uri.parse的使用有点幼稚,并导致了一个警告-您不应该从Uri.parse本身获得该消息。不过,使用该Uri的某些东西可能会向您提供该消息。如何创建包含necessray权限的意向结果-如果希望DocumentFile上的createFile正常工作,您需要使用您控制的Uri与实现DocumentsContract的提供程序联系。@Commonware警告不是来自Uri.parse,这是我写错的。我猜它来自DocumentFile.fromtreeeuri。我更新了问题。