我正在尝试下载一个文件,我得到系统.未经授权的异常:访问路径“/storage/emulated/0/Download/test.pdf”被拒绝.我已经在Android Manifest文件中设置了所需的权限.
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
字符串
下载路径:
Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads)
型
如果我使用下面的路径作为我的下载路径,我可以下载文件。但我不能分享PDF文件到谷歌驱动器,下拉框或任何其他System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal)
我正在使用Xamarin.Forms v2.4.0.282和Xamarin.Android.Support packages v25.4.0.2。
**注意:**当使用Xamarin.Forms version 2.3.5.256-pre 2和Xamarin.Android.Support packages v23.3.0时,代码运行正常,请提出您的想法来解决问题。
提前致谢。
5条答案
按热度按时间nxagd54h1#
根据您使用的Android版本,即使在6.0或更高版本的清单中添加了权限,用户也必须在应用运行时显式启用权限,而在较低版本的安装过程中会询问权限。例如,在应用启动时,我创建了一个方法来检查它是否已启用,如果未启用则请求权限。
字符串
您也可以使用支持库来完成此操作,这更简单,并且允许您不必检查Android版本。
8wigbo562#
如果目标是API 29+,即使您请求权限并且用户赠款权限,您也会收到错误,因为它们更改了存储的工作方式。
正确的解决方案是看看它应该如何在API 29+上完成,然后去做。
但是如果你和我一样,厌倦了Android每天都在让事情变得更加复杂,那么只需将
android:requestLegacyExternalStorage="true"
添加到清单<application>
标记中,然后就可以一直保存到你开始瞄准API 30。lvjbypge3#
如果您的应用程序是针对API 29或更高版本的,您将面临此问题,请转到此链接并查看LandLu的回答:
https://forums.xamarin.com/discussion/171039/saving-files-to-external-storage
之前我使用 return Android.OS.Environment. ExternalFilesDirectory.AbsolutePath; 访问文件夹路径,但使用这一行解决了我的问题:return Android.App.Application.Context.GetExternalFilesDir(“”).AbsolutePath;
这是正确的答案!
nfeuvbwi4#
如果您运行的是Android API级别23或更高版本,您需要用户对运行时的权限,即使您在清单文件中提到了它们。检查,如果用户尚未授予授予
READ_EXTERNAL_STORAGE
&WRITE_EXTERNAL_STORAGE
,请使用以下代码;字符串
如果我使用下面的路径作为我的下载路径,我可以下载文件。但我不能共享PDF文件到谷歌驱动器,下拉框或任何其他系统。环境。GetFolderPath(系统。环境。特殊文件夹。个人)
您正在将文件存储在应用程序的私人存储上。保存到内部存储的所有文件都是您的应用程序的私人文件,其他应用程序(Google Drive,Drop Box或任何其他)无法访问它们(用户也不能)。您可以为此使用任何公共文件夹;
型
piv4azn75#
取代
字符串
与
型