c# - 当我们在 Xamarin.Forms Android 应用程序中将目标 API 版本更改为 26 时无法读取/写入文件

标签 c# android xamarin.forms xamarin.android google-play-services

我们正在使用 Xamarin Forms 开发适用于 Android 和 iOS 的跨平台应用程序。

自 2018 年 11 月起,所有应用包都必须至少以 API 26 为目标,如果失败,应用将不会上传到 Play 商店。

因此在迁移到 API 26 目标版本时,我们面临着将文件读/写到本地存储的问题。

代码如下:

public async Task<string> Get_SavePath(string fileName, MemoryStream stream)
{
    string root = null;
    if (Android.OS.Environment.IsExternalStorageEmulated)
       root = Android.OS.Environment.ExternalStorageDirectory.ToString();
    else
       root = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);

    Java.IO.File myDir = new Java.IO.File(root + "/Signatures");
    myDir.Mkdir();
    Java.IO.File file = new Java.IO.File(myDir, fileName);

    if (file.Exists()) file.Delete();
    try
    {
        FileOutputStream outs = new FileOutputStream(file);
        outs.Write(stream.ToArray());
        outs.Flush();
        outs.Close();
    }
    catch (Exception e) { }

    if (file.Exists())
    {
        Android.Net.Uri path = Android.Net.Uri.FromFile(file);
        string pathString = Android.Net.Uri.FromFile(file).ToString();
        return pathString;
    }
    else
    {
        return "";
    }
}

FileOutputStream outs = new FileOutputStream(file); 总是给出异常 FileNotFoundException

所以基本上这只发生在我们使用目标版本作为 API 26 时,如果降低目标版本它工作正常。

因此,请牢记 Google Play 警告至少要以 API 级别 26 为目标,我们需要立即帮助。

提前致谢

最佳答案

所以在搜索了整个互联网并阅读了很多文章之后,对我有帮助的是添加Read/Write Storage Permissions 的Runtime Permissions。 这非常令人困惑,因为这些东西在较低的目标 API 级别上工作,比如 API 24。 现在我终于可以做事了。

关于c# - 当我们在 Xamarin.Forms Android 应用程序中将目标 API 版本更改为 26 时无法读取/写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52990859/

相关文章:

c# - 使用 .NET 基于属性在 XSLT 中选择元素

c# - 从 System.Collections.Generic.List c# 中选择 x 个元素

c# - 使用 SWTableViewCell 的表格单元格滑动菜单

android - Android 中的 Octicons

android - 如何在 xamarin forms/Android 中正确使用 SVG 图像?

ios - 在 UserControl 中使用自定义字体使我的字体变为粗体

c# - 有没有办法说如果所有条件都为真,否则

Android gmail 未出现在 Nexus 设备(平板电脑和手机)上的邮件 Intent 共享列表中

android - 如何将 Exoplayer 的控件放置在 PlayerView 之外

sqlite - SQLiteException没有这样的表:main。* _ temp