在Xamarin Forms中重复保存到Android上的外部存储

9wbgstp7  于 2022-12-20  发布在  Android
关注(0)|答案(2)|浏览(194)

我正在UWP和Android上开发、构建和使用的Xamarin Forms项目遇到了一个问题(目前不关心iOS)。我的应用程序连接到蓝牙设备来记录数据,将数据存储在应用程序中,并将数据导出到.txt文件或类似文件中,用于应用程序之外的其他用途。在Android上,目标是Android 11或Android 12。
我正在使用Xamarin 17.4.0.301、Visual Studio 17.4.0和.NET框架4.8.04084以及Xamarin.Android SDK 13.1.0.1。
我的问题是尝试重复保存到可访问的文件。目前,我使用的是隐藏在应用内部存储中的文件,使用的文件路径如下:

string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "data.txt");

这当然适用于UWP和Android;但是,由于它是内部的,所以不能通过Android上的文件资源管理器访问它。要在Android上看到它,我必须将它从应用程序导出到文件资源管理器应用程序中,使用如下代码,其中命令与按钮按下绑定:

OnShareDataCommand = new Command(ShareDataButtonClick);
...
private async void ShareDataButtonClick() {
            string fileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "data.txt");
            await Share.RequestAsync(new ShareFileRequest {
                Title = "Share Data",
                File = new ShareFile(fileName)
            });
        }

这需要用户按下按钮进行导出。**我希望系统自动在文件资源管理器中的某个可访问位置(如下载文件夹)创建文件,并在调用函数时持续保存到该文件。**为此,我在Android Manifest中启用了外部存储访问权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

但是我在访问它时遇到了问题。第一个问题是当我试图创建一个像这样的外部存储中的文件路径时,基于this StackOverflow问题:

var fullPath = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.AbsolutePath, "file_name.txt");

当我这样做的时候,它说Android不在上下文中。我想这是因为我正在为多个平台构建Xamarin Forms。我该如何解决这个问题?我如何在Xamarin Forms中访问Android的外部存储?我可以创建一个特定于平台的函数吗?如果可以,我该如何操作?
这个Xamarin forums solution不起作用。
我试过使用External Storage for Xamarin.Android guide中的这一行,但也不起作用,因为它说环境没有使用的方法:

Environment.GetExternalStoragePublicDirectory(Environment.DirectoryDocuments).AbsolutePath

有什么建议吗?我不想让它成为一个Android特定的应用程序,因为我需要UWP功能,但我可以使一个平台特定的保存功能。

au9on6nz

au9on6nz1#

由于Android 11不允许读/写外部存储,所以不会授予权限,除非你有文件资源管理器这样的应用,即使这样也要向谷歌申请才会被接受,所以你需要忘记写外部存储的事情。
请参见以下链接https://medium.com/swlh/sample-for-android-storage-access-framework-aka-scoped-storage-for-basic-use-cases-3ee4fee404fchttps://www.zoftino.com/how-to-create-browse-files-option-in-androidhttps://mateuszteteruk.pl/how-to-use-android-storage-access-framework-with-examplehttps://thedroidlady.com/2020-08-24-android-scoped-storage-demystified
当我发布Android 11时,我用我的应用程序做了这件事。
如果你需要任何进一步的帮助,请回复这里。我应该补充,我只写Android应用程序,所以我不能帮助任何形式相关或UWP

lqfhib0f

lqfhib0f2#

@ToolmakeSteve,你的问题是写给我的吗?我是用C#和Xamarin. Android编写的。我不认为几个代码片段会提供任何有用的东西。只需点击链接和你发布的链接。我会尝试提供一个测试应用程序,但我现在没有足够的时间这样做。

相关问题