Android 无法共享或打开下载到";的pdf文件;下载「;包含其他应用程序的文件夹

Android 无法共享或打开下载到";的pdf文件;下载「;包含其他应用程序的文件夹,android,share,android-download-manager,android-fileprovider,Android,Share,Android Download Manager,Android Fileprovider,我使用downloadManager下载文件: private fun downloadFile(exportModel: Export, i: Int) { val request: DownloadManager.Request = DownloadManager.Request(Uri.parse(exportModel.data.path + exportModel.data.files[i].filename)) .setTitle(exportMode

我使用downloadManager下载文件:

private fun downloadFile(exportModel: Export, i: Int) {
    val request: DownloadManager.Request = DownloadManager.Request(Uri.parse(exportModel.data.path + exportModel.data.files[i].filename))
            .setTitle(exportModel.data.files[i].filename)
            .setDescription("Downloading")
            .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
            .setAllowedOverMetered(true)
            .setAllowedOverRoaming(true)
            .setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, exportModel.data.files[i].filename)
    val downloadManager = activity?.getSystemService(DOWNLOAD_SERVICE) as DownloadManager
    val downloadID = downloadManager.enqueue(request) // enqueue puts the download request in the queue.
}
下载完成(可以从AS中的设备文件浏览器打开),然后我尝试共享它(例如,我有一个名为“Export file.pdf”的文件,exists()返回true):

调试值:

file = /storage/emulated/0/Download/Export File.pdf
fileUri=content://com.thirdframestudios.android.expensoor.cache_directory_provider/Download/Export%20File.pdf
显示共享表(在emulator api 29上测试),但当我选择某个应用程序时(例如,驱动器,当它尝试上载文件时,我会出错)。如果我尝试用ACTION_视图打开文件(pdf查看器打开一小会儿,然后关闭),也会发生类似的情况。 尝试使用操作视图打开文件时出错:

2020-10-21 12:58:32.183 18445-18496/? E/DisplayData: openFd: java.io.FileNotFoundException: open failed: EACCES (Permission denied)
2020-10-21 12:58:32.183 18445-18496/? E/PdfLoader: Can't load file (doesn't open)  Display Data [PDF : Export File.pdf] +ContentOpenable, uri: content://com.thirdframestudios.android.expensoor.cache_directory_provider/Download/Export%20File.pdf
我的文件提供程序:

  <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.thirdframestudios.android.expensoor.cache_directory_provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

我的文件\u paths.xml文件:


注册广播接收器,以便在下载管理器准备就绪时通知您

您可以从下载管理器获取下载文件的uri,您可以在操作视图中使用该uri


或者使用setDestinationNexternalFilesDir()下载到getExternalFilesDir()。

注册广播接收器,以便在下载管理器就绪时通知您

您可以从下载管理器获取下载文件的uri,您可以在操作视图中使用该uri


或者使用setDestinationNexternalFilesDir()下载到getExternalFilesDir()。

经过几个小时的搜索,我找到了类似的解决方案。只需将目录设置从下载请求中删除即可。下线。在安卓11上测试

setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, exportModel.data.files[i].filename) 
//拆下上面的线。最后下载请求如下所示:>

val request = DownloadManager.Request(Uri.parse(url))
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE or DownloadManager.Request.NETWORK_WIFI)
        request.setTitle(requireContext().getString(R.string.downloaded))
        request.setDescription(keyValue)
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
        manager.enqueue(request)

经过几个小时的搜索,我找到了这样的解决方案。只需将目录设置从下载请求中删除即可。下线。在安卓11上测试

setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, exportModel.data.files[i].filename) 
//拆下上面的线。最后下载请求如下所示:>

val request = DownloadManager.Request(Uri.parse(url))
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE or DownloadManager.Request.NETWORK_WIFI)
        request.setTitle(requireContext().getString(R.string.downloaded))
        request.setDescription(keyValue)
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
        manager.enqueue(request)

DownloadManager
通过另一个应用程序进行下载。抱歉,即使您的应用程序是请求下载的应用程序,您的应用程序也无法读取Android 10+上下载的内容。试试看你是否运气更好。我自己下载的,我无法保存到“Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u下载)”中。如果我下载到上下文!!。getExternalFilesDir(Environment.DIRECTORY_下载)它可以工作(可以打开和共享)。若我做对了,就并没有办法将它dll到公共下载目录并从那个里共享它了?我想让我的用户在文件管理器应用程序中看到下载的文件(以及在我的应用程序被删除后保留在手机上的文件),所以我有什么选择?我现在能提供给你的最好的东西是。@Commonware现在面临着同样的问题。我们现在有任何经验证的解决方案吗?TIA.
DownloadManager
通过另一个应用程序进行下载。抱歉,即使您的应用程序是请求下载的应用程序,您的应用程序也无法读取Android 10+上下载的内容。试试看你是否运气更好。我自己下载的,我无法保存到“Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u下载)”中。如果我下载到上下文!!。getExternalFilesDir(Environment.DIRECTORY_下载)它可以工作(可以打开和共享)。若我做对了,就并没有办法将它dll到公共下载目录并从那个里共享它了?我想让我的用户在文件管理器应用程序中看到下载的文件(以及在我的应用程序被删除后保留在手机上的文件),所以我有什么选择?我现在能提供给你的最好的东西是。@Commonware现在面临着同样的问题。我们现在有任何经验证的解决方案吗?蒂亚。