【问题标题】:Xamarin.forms FileProvider.GetUriForFile - The name 'context' does not exist in the current contextXamarin.forms FileProvider.GetUriForFile - 当前上下文中不存在名称“上下文”
【发布时间】:2020-03-25 05:19:41
【问题描述】:

我的代码有问题,我在使用 FileProvider 时已经使用了一些方向,但到目前为止我不确定如何定义“上下文”,请有人指出我正确的方向,以便我可以让 FileProvider 工作. 以下是我的代码:

        Java.IO.File dir = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);
        Java.IO.File file = new Java.IO.File(dir, "Write.txt");
        Intent email = new Intent(Intent.ActionSend);

        Uri path = FileProvider.GetUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file);

        file.SetReadable(true, false);
        file.SetWritable(true, false);


        email.SetType("text/plain");
        email.PutExtra(Intent.ExtraEmail, Recipients);
        email.PutExtra(Intent.ExtraCc, new string[] { "email@example.com" });
        email.PutExtra(Intent.ExtraSubject, Subject);
        email.PutExtra(Intent.ExtraText, EmailBodytxt);
        email.PutExtra(Intent.ExtraStream, path);
        email.SetType("message/rfc822");
        MainActivity.Instance.StartActivity(email);

【问题讨论】:

  • 可以吗?

标签: xamarin.forms android-context android-fileprovider


【解决方案1】:
Uri path = FileProvider.GetUriForFile(context, context.getApplicationContext().getPackageName() + ".provider", file);

这一行似乎是用 Java 编写的。

你可以尝试改变:

Context context = Android.App.Application.Context;
Android.Net.Uri path = FileProvider.GetUriForFile(context, context.PackageName+".provider", file);// make sure ".provider" is the same as "android:authorities" you defined in your AndroidManifest provider

顺便说一句,我看到你有一个静态变量 MainActivity.Instance。有时你也可以将它用作上下文。

Android.Net.Uri path = FileProvider.GetUriForFile(MainActivity.Instance, MainActivity.Instance.PackageName+ ".provider", file);

【讨论】:

    【解决方案2】:

    要正确设置上下文,您应该像Dave's Tech Blog suggest

    您应该创建一个MainApplication class 并使其派生自IActivityLifecycleCallbacks

    using System;
    using Android.App;
    using Android.Content;
    using Android.OS;
    using Android.Runtime;
    
    namespace MyApp.Droid
    {
        [Application]
        public partial class MainApplication : Application, Application.IActivityLifecycleCallbacks
        {
            internal static Context CurrentContext { get; private set; }
    
            internal static String FileProviderAuthority
            {
                get => MainApplication.CurrentContext.ApplicationContext.PackageName + ".fileprovider";
            }
    
            public MainApplication(IntPtr handle, JniHandleOwnership transfer) : base(handle, transfer)
            {
            }
    
            public override void OnCreate()
            {
                base.OnCreate();
                RegisterActivityLifecycleCallbacks(this);
            }
    
            public override void OnTerminate()
            {
                base.OnTerminate();
                UnregisterActivityLifecycleCallbacks(this);
            }
    
            public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
            {
                CurrentContext = activity;
            }
    
            public void OnActivityDestroyed(Activity activity)
            {
    
            }
    
            public void OnActivityPaused(Activity activity)
            {
    
            }
    
            public void OnActivityResumed(Activity activity)
            {
                CurrentContext = activity;
            }
    
            public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
            {
    
            }
    
            public void OnActivityStarted(Activity activity)
            {
                CurrentContext = activity;
            }
    
            public void OnActivityStopped(Activity activity)
            {
    
            }
        }
    }
    

    引用戴夫的话:

    无论何时创建、启动或恢复 Activity,都会使用对当前 Activity 的引用来更新 CurrentContext 属性。因此,该属性将始终具有对当前 Activity 的引用,然后可以将其用作本地上下文。

    使用它,您可以简单地更改上下文引用,例如

    Uri path = FileProvider.GetUriForFile(MainApplication.CurrentContext, MainApplication.FileProviderAuthority, file);
    

    请注意,我还在MainApplication 中定义了FileProviderAuthority

    我希望这可以帮助你继续。

    【讨论】:

      【解决方案3】:

      尝试使用大写 C 的上下文,如果可能,请在代码中显示整个过程。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-02
        • 2014-04-22
        • 2017-06-17
        • 2015-09-11
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        相关资源
        最近更新 更多