【问题标题】:Failed to find configured root that contains /data/data/com未能找到包含 /data/data/com 的已配置根目录
【发布时间】:2021-02-16 19:47:44
【问题描述】:

我正在尝试在我的 Xamarin 表单应用程序中生成一个 pdf 文件。我正在为此使用 Syncfusion 库。

但我在FileProvider.GetUriForFile() 方法上遇到了错误:

“未能找到包含 /data/data/com.companyname.myappname/files/Syncfusion/Output.pdf 的已配置根”

这是我的清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.myappname">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="29" />
    <application android:label="myappname.Android" android:theme="@style/MainTheme">
    <provider
           android:name="androidx.core.content.FileProvider"
           android:authorities="${applicationId}.provider"
           android:exported="false"
           android:grantUriPermissions="true">
      <meta-data
          android:name="android.support.FILE_PROVIDER_PATHS"
          android:resource="@xml/provider_paths" />
    </provider>
  </application>
  
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
</manifest>

我的 provider_paths :

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
  <external-files-path
      name="external_files"
      path="." />
</paths>

还有我的方法调用:

  public async Task SaveAndView(string fileName, String contentType, MemoryStream stream)
    {
        string exception = string.Empty;
        string root = null;

        if (ContextCompat.CheckSelfPermission(Forms.Context, Manifest.Permission.WriteExternalStorage) != Permission.Granted)
        {
            ActivityCompat.RequestPermissions((Android.App.Activity)Forms.Context, new String[] { Manifest.Permission.WriteExternalStorage }, 1);
        }

        if (Android.OS.Environment.IsExternalStorageEmulated)
        {
            root = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            //root = Android.OS.Environment.ExternalStorageDirectory.ToString();
        }
        else
        {
            root = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        }  

        Java.IO.File myDir = new Java.IO.File(root + "/Syncfusion");
        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)
        {
            exception = e.ToString();
        }
        if (file.Exists() && contentType != "application/html")
        {
            try
            {
                string extension = Android.Webkit.MimeTypeMap.GetFileExtensionFromUrl(Android.Net.Uri.FromFile(file).ToString());
                string mimeType = Android.Webkit.MimeTypeMap.Singleton.GetMimeTypeFromExtension(extension);
                Intent intent = new Intent(Intent.ActionView);
                intent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
                Android.Net.Uri path = FileProvider.GetUriForFile(Forms.Context, Android.App.Application.Context.PackageName + ".provider", file);
                //Android.Net.Uri path = FileProvider.GetUriForFile(Forms.Context, BuildConfig.ApplicationId + ".provider", file);
                intent.SetDataAndType(path, mimeType);
                intent.AddFlags(ActivityFlags.GrantReadUriPermission);
                Forms.Context.StartActivity(Intent.CreateChooser(intent, "Choose App"));
            }
            catch(Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }

我检查了所有关于此的 stackoverflow 主题,但我仍然收到错误:/

我也是 Xamarin.Android 的新手(之前只使用过交叉码)

谢谢!

【问题讨论】:

  • 已解决!我将 provider_paths 更改为 schemas.android.com/apk/res/android">

标签: c# android xamarin xamarin.android syncfusion


【解决方案1】:

通过对给定代码的进一步分析,我们发现您在参考中的 Android.cs 文件的 SaveAndView 方法中修改了文件夹路径(root)知识库文档下方。
https://www.syncfusion.com/kb/9174/how-to-create-a-pdf-file-in-xamarin

由于此更改,仅出现报告的问题。您能否在 Android 项目资源文件夹下的 provider_paths.xml 中尝试以下代码,因为这适用于提供的 SaveAndView 方法代码。

<?xml version="1.0" encoding="UTF-8" ?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<root-path name="root" path="."/> 
</paths>  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多