FileProvider.getUriForFile() 抛出非法参数异常(内部存储问题)
FileProvider.getUriForFile() throwing illegal argument exception (Internal Storage issue)
我相信我已经尝试了几乎所有遇到的问题,但无法解决此错误,请有人帮忙。
我的文件存在于文件夹中:
这是我的内部存储空间的样子
编辑:更新的屏幕截图
Internal storage shows that file does exist
我的代码如下:
val intent = Intent(Intent.ACTION_VIEW)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
val uriNew = FileProvider.getUriForFile(this@, "com.thatapp.fileprovider", filePDF)
intent.setDataAndType(uriNew,"application/pdf")
try{
startActivity(intent);
} catch(e:ActivityNotFoundException){
val toast = Toast.makeText(this,"No app found to open the PDF. Please install Adobe Reader",Toast.LENGTH_SHORT)
toast.show()
}
错误如下:
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.thatapp.sitereport/app_Site_20180811_112642/Report_20180811_122857.pdf
最后我的 file_paths 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="My_Images" path="." />
<files-path
name="Files"
path="/"/>
<!--external-path name="external_files" path="."/-->
</paths>
停止将文件和目录直接放入/data/data/com.thatapp.sitereport/
。我不确定你是怎么做到的。在 Context
上使用 getFilesDir()
并将您的文件和子目录放在那里。这等同于 /data/data/com.thatapp.sitereport/files/
(尽管确切路径会因设备和用户而异)。
届时,您现有的 FileProvider
设置应该可以正常工作。
如果您坚持将文件保存在那个位置,那是您的决定,但是您不能使用 FileProvider
,因为它不支持从那里提供服务。您需要创建自己的 ContentProvider
来提供这些文件。
我相信我已经尝试了几乎所有遇到的问题,但无法解决此错误,请有人帮忙。
我的文件存在于文件夹中:
这是我的内部存储空间的样子 编辑:更新的屏幕截图 Internal storage shows that file does exist
我的代码如下:
val intent = Intent(Intent.ACTION_VIEW)
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
val uriNew = FileProvider.getUriForFile(this@, "com.thatapp.fileprovider", filePDF)
intent.setDataAndType(uriNew,"application/pdf")
try{
startActivity(intent);
} catch(e:ActivityNotFoundException){
val toast = Toast.makeText(this,"No app found to open the PDF. Please install Adobe Reader",Toast.LENGTH_SHORT)
toast.show()
}
错误如下:
java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.thatapp.sitereport/app_Site_20180811_112642/Report_20180811_122857.pdf
最后我的 file_paths 看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="My_Images" path="." />
<files-path
name="Files"
path="/"/>
<!--external-path name="external_files" path="."/-->
</paths>
停止将文件和目录直接放入/data/data/com.thatapp.sitereport/
。我不确定你是怎么做到的。在 Context
上使用 getFilesDir()
并将您的文件和子目录放在那里。这等同于 /data/data/com.thatapp.sitereport/files/
(尽管确切路径会因设备和用户而异)。
届时,您现有的 FileProvider
设置应该可以正常工作。
如果您坚持将文件保存在那个位置,那是您的决定,但是您不能使用 FileProvider
,因为它不支持从那里提供服务。您需要创建自己的 ContentProvider
来提供这些文件。