尝试使用 Xamarin 打开 GPS 设置页面时获取 Java.Lang.NullPointerException

Getting Java.Lang.NullPointerException when trying to open GPS Settings page using Xamarin

如果 GPS 未启用(在 Xamarin 中),我在尝试打开 GPS 设置页面时遇到以下错误:

Unknown identifier: StartActivity

Unhandled Exception:

Java.Lang.NullPointerException:

有人可以指导我哪里错了吗?

这是我的界面

namespace MyApp
{
    public interface GpsSettings
    {
        void showGpsSettings();
    }
}

这是实现

[assembly: Xamarin.Forms.Dependency(typeof(GpsSettingsImplementation))]
namespace MyApp.Droid
{

    public class GpsSettingsImplementation : Activity, GpsSettings
    {
        public GpsSettingsImplementation()
        {

        }


        public void showGpsSettings()
        {

            var intent = new Intent(Android.Provider.Settings.ActionLocationSourceSettings);
            StartActivity(intent);
        }
    }
}

这就是我在单击按钮时调用函数的方式

 DependencyService.Get<GpsSettings>().showGpsSettings();

An existing Activity instance has a bit of work that goes on behind the scenes when it's constructed; activities started through the intent system (all activities) will have a Context reference added to them when they are instantiated. This context reference is used in the call-chain of StartActivity.

So, the Java.Lang.NullPointerException seen after invoking StartActivity on your Test activity instance is because the Context inside that instance has never been set. By using the new operator to create an activity instance you've circumvented the normal way activities are instantiated, leaving your instance in an invalid state!

参考:

以上错误可以通过以下方式解决:

[assembly: Xamarin.Forms.Dependency(typeof(GpsSettingsImplementation))]
namespace MyApp.Droid
{
    public class GpsSettingsImplementation : Activity, GpsSettings
    {
        public GpsSettingsImplementation()
        {

        }


        public void showGpsSettings()
        {

            var intent = new Intent(Android.Provider.Settings.ActionLocationSourceSettings);
            intent.SetFlags(ActivityFlags.NewTask);
            Android.App.Application.Context.StartActivity(intent);

        }
    }
}