据我所知,在使用 Jetpack Compose 和 Hilt 时,有两种创建/访问 viewModel 实例的方法;viewModel() 和 hiltViewModel()。我不明白应该使用哪个,因为它们似乎做同样的事情。viewModel() 的文档表明它会自动使用 Hilt 通过 @HiltViewModel 构建的视图模型。那么这两种实现之间到底有什么区别以及什么时候应该使用它们呢?
android dependency-injection viewmodel android-viewmodel dagger-hilt
我正在从服务器下载 PDF 文件并将响应正文字节流传递到下面的函数中,该函数将 PDF 文件成功存储在用户下载文件夹中。
@RequiresApi(Build.VERSION_CODES.Q)
fun saveDownload(pdfInputStream: InputStream) {
val values = ContentValues().apply {
put(MediaStore.Downloads.DISPLAY_NAME, "test")
put(MediaStore.Downloads.MIME_TYPE, "application/pdf")
put(MediaStore.Downloads.IS_PENDING, 1)
}
val resolver = context.contentResolver
val collection = MediaStore.Downloads.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY)
val itemUri = resolver.insert(collection, values)
if (itemUri != null) {
resolver.openFileDescriptor(itemUri, "w").use { parcelFileDescriptor ->
ParcelFileDescriptor.AutoCloseOutputStream(parcelFileDescriptor)
.write(pdfInputStream.readBytes())
}
values.clear()
values.put(MediaStore.Downloads.IS_PENDING, 0)
resolver.update(itemUri, values, null, null)
}
}
Run Code Online (Sandbox Code Playgroud)
现在,一旦该函数返回,我想打开保存的 PDF 文件。我尝试了多种方法来使其正常工作,但选择器总是说没有任何内容可以打开文件。我认为要么仍然存在权限问题(也许我使用的 FileProvider 错误?),要么路径错误,或者可能完全是其他问题。
以下是我尝试过的几个示例:
fun uriFromFile(context: Context, file: File): Uri {
return FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file)
}
Run Code Online (Sandbox Code Playgroud)
A)
val openIntent …Run Code Online (Sandbox Code Playgroud)