如何从我们在xamarin.forms中的应用程序打开设置?

Rut*_*hta 3 android xamarin.android xamarin xamarin.forms

我正在研究xamarin.forms.(仅在android中遇到以下问题)

当我的应用程序启动时,它会检查我的GPS位置是打开还是关闭.

要打开或关闭GPS位置我正在使用依赖服务.

public static bool CheckGPSConnection()
        {
            var gpsConnection = DependencyService.Get<IGPSConnectivity>();
            return gpsConnection.CheckGPSConnection();
        }
Run Code Online (Sandbox Code Playgroud)

当我来到我的应用程序的主页时,我把下面的代码

if (Device.OS == TargetPlatform.Android)
{
    if (!App.CheckGPSConnection())
    {
        bool answer = await DisplayAlert("Alert", "Would you like to start GPS?", "Yes", "No");
        if (answer)
        {
              Android.App.Application.Context.StartActivity(new Android.Content.Intent(Android.Provider.Settings.ActionLocationSourceSettings));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但它给了我一个例外

{Android.Util.AndroidRuntimeException:从Activity上下文外部调用startActivity()需要FLAG_ACTIVITY_NEW_TASK标志.这真的是你想要的吗?在/ Users/...中的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()[0x0000c]

我该怎么办?

Ger*_*uis 7

这是特定于平台的功能,因此您应该为它创建DependencyService.

就像IGPSConnectivity创建另一个界面一样.例如ISettingsService.

public interface ISettingsService
{
    void OpenSettings();
}
Run Code Online (Sandbox Code Playgroud)

然后在Android上,实现如下:

public class SettingsServiceAndroid : ISettingsService
{
    public void OpenSettings()
    {
        Xamarin.Forms.Forms.Context.StartActivity(new Android.Content.Intent(Android.Provider.Settings.ActionLocat??ionSourceSettings));
    }
}
Run Code Online (Sandbox Code Playgroud)

现在再次从您的共享PCL代码中调用它,就像使用GPS连接一样.

DependencyService.Get<ISettingsService>().OpenSettings();

因为您正在使用DependencyService,所以将注入每个平台的正确实现.因此,没有必要使用该if (Device.OS == TargetPlatform.Android)线,除非您出于其他原因这样做.此外,我认为此方法现已弃用.你现在应该使用Device.RuntimePlatform == Device.AndroidXamarin.Forms 2.3.4.