打开位置设置页面或提示用户启用位置

3
我一直在努力搜索并尝试着自己解决问题,但一直没有成功。我想知道如何在应用中提示用户去开启定位,这可以通过直接跳转至设置页面或在屏幕上点击“是”来完成。
我看到的所有代码都似乎不能起作用。请问有人有能够实现此功能的例子吗?非常感谢详细的说明。
我刚开始学习Xamarin开发,希望能够使用Xamarin Forms实现此功能。但如果只有针对Android的实现方法也可以,因为我没有iOS模拟器。
图片链接如下:this page or this

你说的“切换位置”是什么意思?是指为你的应用打开位置权限吗? - Steve Chadbourne
我是指在设备的设置中打开或关闭位置服务,而不是应用程序。 - bob269
@lalith,我再也看不到你的评论了。 - bob269
有人可以指导我吗? - bob269
我已经添加了图片来说明我的意思。如果我得到上述任何一种,都会很棒。 - bob269
3个回答

3
所以,在经过多个互联网教程和答案的研究后,我终于找到了实现想要达成目标的方法。
我使用了一个依赖服务,正如这里的一个答案所指示的那样:如何在Xamarin中从我们的应用程序中打开设置 有几件事情没有被提及,例如在特定平台项目中使用它需要注册接口。
以下是代码,供任何需要的人使用: 接口: 我称我的接口为ILocSettings.cs
using System;
using System.Collections.Generic;
using System.Text;


[assembly: Xamarin.Forms.Dependency(typeof(DE2.ILocSettings))]
namespace DE2
{
    public interface ILocSettings
    {
        void OpenSettings();

    }

这个表单上有一个按钮,我称其为DataEntryForm。

DataEntryForm.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="DE2.DataEntryForm"
             >
    <ContentPage.Content>
        <StackLayout>

            <Button x:Name="TurnLocationOn"
                    Text="Turn On Location"
                    Clicked="TurnLocationOn_OnClicked"/>

        </StackLayout>
    </ContentPage.Content>
</ContentPage>

然后是DataEntryForm.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using Plugin.pbXSettings;
using Plugin.Geolocator;
using Plugin.Permissions;
using Plugin.Permissions.Abstractions;
using Plugin.DeviceInfo;
using Plugin.DeviceInfo.Abstractions;

[assembly: Xamarin.Forms.Dependency(typeof(DE2.ILocSettings))]

namespace DE2
{

    using Xamarin.Forms.PlatformConfiguration;

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class DataEntryForm : ContentPage
    {
        public DataEntryForm ()
        {
            InitializeComponent ();

        }


        private async void  TurnLocationOn_OnClicked(object sender, global::System.EventArgs e)
        {

            var myAction = await DisplayAlert("Location", "Please Turn On Location", "OK","CANCEL");
            if (myAction)
            {
                if (Device.RuntimePlatform == global::Xamarin.Forms.Device.Android)
                {

                    //DependencyService.Get<ISettingsService>().OpenSettings();
                    global::Xamarin.Forms.DependencyService.Get<global::DE2.ILocSettings>().OpenSettings();



                }
                else
                {
                    DisplayAlert("Device", "You are using some other shit", "YEP");
                }
            }
            else
            {
                DisplayAlert("Alert","User Denied Permission","OK");
            }


            // 
        }
    }
}

然后我将这个类放置在Android特定平台上的LocationZ.cs中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Locations;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Xamarin.Android;
using Xamarin.Forms;
using DE2;
using DE2.Droid;


//[assembly: Xamarin.Forms.Dependency(typeof(ILocSettings))]

//Notice the use of LocationZ in registering below instead of ILocSettings

[assembly: Xamarin.Forms.Dependency(typeof(LocationZ))]

namespace DE2.Droid
{
    using System.Runtime.Remoting.Messaging;

    using Android.Support.V4.View;
    using Android.Support.V7.App;

    using Xamarin.Forms;
    using DE2;


    public class LocationZ : ILocSettings
    {
        public void OpenSettings()
        {
            LocationManager LM = (LocationManager)Forms.Context.GetSystemService(Context.LocationService);


            if (LM.IsProviderEnabled(LocationManager.GpsProvider)==false)
            {


                            Context ctx = Forms.Context;
                            ctx.StartActivity(new Intent(Android.Provider.Settings.ActionLocationSourceSettings));


            }
            else
            {
                //this is handled in the PCL
            }
        }


    }
}

`


使用Android.App.Application.Context替换Forms.Context,因为Forms.Context已经过时。 - Joseph

1
如果您想让用户授予位置权限,最简单的方法是使用权限插件。这允许您请求和检查特定权限。 权限插件和完整文档可在此处找到 然后,您将能够执行以下操作:
try
{
    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);
    if (status != PermissionStatus.Granted)
    {
        if(await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
        {
            await DisplayAlert("Need location", "Gunna need that location", "OK");
        }

        var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location);
        //Best practice to always check that the key exists
        if(results.ContainsKey(Permission.Location))
            status = results[Permission.Location];
    }

    if (status == PermissionStatus.Granted)
    {
        var results = await CrossGeolocator.Current.GetPositionAsync(10000);
        LabelGeolocation.Text = "Lat: " + results.Latitude + " Long: " + results.Longitude;
    }
    else if(status != PermissionStatus.Unknown)
    {
        await DisplayAlert("Location Denied", "Can not continue, try again.", "OK");
    }
}
catch (Exception ex)
{

    LabelGeolocation.Text = "Error: " + ex;
}

谢谢您的回复,但我需要的是让用户被提示启用位置服务,可以通过在某个地方仅按“是”或转到位置设置页面并启用位置来实现。至于上面的示例,我已经做到了,并且它正在工作,但仅当设备中的位置已启用时才有效。我想要我的应用程序的额外功能是在位置服务关闭时要求用户打开位置服务。 - bob269
有人在Xamarin Forms中完成了这个吗?即使它只在Android上工作,但解决方案是多平台的。 - bob269
我找到了解决方案,今天下班后我会分享。感谢所有做出贡献的人,我不得不使用一些混合方法。 - bob269

0

First

Third

这些图片展示了屏幕上的设置页面


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接