Xamarin.forms 以Xamarin表单下载文件

Xamarin.forms 以Xamarin表单下载文件,xamarin.forms,xamarin.android,Xamarin.forms,Xamarin.android,在Xamarin.Forms项目中,我试图从blob存储中下载该文件,还需要将其保存在设备本地文件夹中,并需要立即打开它 我在打开文件时遇到此异常 Fil:///localfolderurloff文件通过Intent.getData()在应用程序之外公开 我得到这个例外只有在安卓版本是大于棉花糖 以下是我用来打开文件的代码: public void SaveandOpenFile(byte[] data, string fileName) { string externa

在Xamarin.Forms项目中,我试图从blob存储中下载该文件,还需要将其保存在设备本地文件夹中,并需要立即打开它

我在打开文件时遇到此异常 Fil:///localfolderurloff文件通过Intent.getData()在应用程序之外公开

我得到这个例外只有在安卓版本是大于棉花糖

以下是我用来打开文件的代码:

public void SaveandOpenFile(byte[] data, string fileName)
    {
        string externalStorageState = global::Android.OS.Environment.ExternalStorageState;
        var externalPath = global::Android.OS.Environment.ExternalStorageDirectory.Path + "/" + global::Android.OS.Environment.DirectoryDownloads + "/" + fileName;
        File.WriteAllBytes(externalPath, data);

        Java.IO.File file = new Java.IO.File(externalPath);
        file.SetReadable(true);

        string application = "";
        string extension = Path.GetExtension(externalPath);

        // get mimeTye
        switch (extension.ToLower())
        {
            case ".txt":
                application = "text/plain";
                break;
            case ".doc":
            case ".docx":
                application = "application/msword";
                break;
            case ".pdf":
                application = "application/pdf";
                break;
            case ".xls":
            case ".xlsx":
                application = "application/vnd.ms-excel";
                break;
            case ".jpg":
            case ".jpeg":
            case ".png":
                application = "image/jpeg";
                break;
            default:
                application = "*/*";
                break;
        }

        //Android.Net.Uri uri = Android.Net.Uri.Parse("file://" + filePath);
        Android.Net.Uri uri = Android.Net.Uri.FromFile(file);
        Intent intent = new Intent(Intent.ActionView);
        intent.SetDataAndType(uri, application);
        intent.SetFlags(ActivityFlags.ClearWhenTaskReset | ActivityFlags.NewTask);

        Forms.Context.StartActivity(intent);
    }

如果我遗漏了什么,请告诉我。提前谢谢

在新版本中,您不能在应用程序外部公开该文件。你应该做一些事情来做到这一点。遵循以下步骤:

步骤1:转到android的清单文件,并在应用程序标记中定义文件提供程序

<provider android:name="android.support.v4.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>
第5步:打开文件,下面是我用来分享的方法。希望您理解并相应地对您的进行更改:

    public Task Share(string title, string message, string filePath)
    {
        var extension = filePath.Substring(filePath.LastIndexOf(".",StringComparison.InvariantCultureIgnoreCase) + 1).ToLower();
        var contentType = string.Empty;

        Java.IO.File file=new  Java.IO.File(filePath);
        var apkURI = FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName+ ".provider", file);

        switch (extension)
        {
            case "pdf":
                contentType = "application/pdf";
                break;
            case "png":
                contentType = "image/png";
                break;
            default:
                contentType = "application/octetstream";
                break;
        }

        var intent = new Intent(Intent.ActionSend);

        intent.SetFlags(ActivityFlags.GrantReadUriPermission);

        intent.SetType(contentType);
        intent.PutExtra(Intent.ExtraStream, apkURI);
        intent.PutExtra(Intent.ExtraText, string.Empty);
        intent.PutExtra(Intent.ExtraSubject, message ?? string.Empty);


        var chooserIntent = Intent.CreateChooser(intent, title ?? string.Empty);
        chooserIntent.SetFlags(ActivityFlags.ClearTop);
        chooserIntent.SetFlags(ActivityFlags.NewTask);

        context.StartActivity(chooserIntent);

        return Task.FromResult(true);
    }
如果你需要帮助,请告诉我

root = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
    public Task Share(string title, string message, string filePath)
    {
        var extension = filePath.Substring(filePath.LastIndexOf(".",StringComparison.InvariantCultureIgnoreCase) + 1).ToLower();
        var contentType = string.Empty;

        Java.IO.File file=new  Java.IO.File(filePath);
        var apkURI = FileProvider.GetUriForFile(context, context.ApplicationContext.PackageName+ ".provider", file);

        switch (extension)
        {
            case "pdf":
                contentType = "application/pdf";
                break;
            case "png":
                contentType = "image/png";
                break;
            default:
                contentType = "application/octetstream";
                break;
        }

        var intent = new Intent(Intent.ActionSend);

        intent.SetFlags(ActivityFlags.GrantReadUriPermission);

        intent.SetType(contentType);
        intent.PutExtra(Intent.ExtraStream, apkURI);
        intent.PutExtra(Intent.ExtraText, string.Empty);
        intent.PutExtra(Intent.ExtraSubject, message ?? string.Empty);


        var chooserIntent = Intent.CreateChooser(intent, title ?? string.Empty);
        chooserIntent.SetFlags(ActivityFlags.ClearTop);
        chooserIntent.SetFlags(ActivityFlags.NewTask);

        context.StartActivity(chooserIntent);

        return Task.FromResult(true);
    }