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

时间:2017-04-25 10:25:01

标签: android xamarin xamarin.android xamarin.forms

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

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

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

public static bool CheckGPSConnection()
        {
            var gpsConnection = DependencyService.Get<IGPSConnectivity>();
            return gpsConnection.CheckGPSConnection();
        }

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

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));
        }
    }
}

但它给了我一个例外

  

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

我该怎么办?

2 个答案:

答案 0 :(得分:7)

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

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

public interface ISettingsService
{
    void OpenSettings();
}

然后在Android上,按照以下方式实现:

public class SettingsServiceAndroid : ISettingsService
{
    public void OpenSettings()
    {
        Xamarin.Forms.Forms.Context.StartActivity(new Android.Content.Intent(Android.Provider.Settings.ActionLocat‌​ionSourceSettings));
    }
}

现在再次使用您的共享PCL代码进行呼叫,就像使用GPS连接一样。

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

因为您正在使用DependencyService,所以将注入每个平台的正确实现。所以,没有必要使用if (Device.OS == TargetPlatform.Android)行,除非你出于其他原因这样做。另外,我认为这种方法现在是deprecated。您现在应该使用Xamarin.Forms 2.3.4。{/ p>中的Device.RuntimePlatform == Device.Android

答案 1 :(得分:0)

在Android中,我使用它(使用DependencyServices调用)来打开设置

    public void View(){
        LocationManager locationManager = (LocationManager)Forms.Context.GetSystemService(Context.LocationService);

        if (locationManager.IsProviderEnabled(LocationManager.GpsProvider) == false)
        {
            Intent gpsSettingIntent = new Intent(Settings.ActionLocationSourceSettings);
            Forms.Context.StartActivity(gpsSettingIntent);
        }
    }