3

i've been hacking my brain and googling away in vain. i am trying to find a way to prompt the user to switch location on either by going directly to the settings page or just tapping yes on the screen. all code i've seen doesn't seem to work. does any one have something that works. a detailed example will be much appreciated. thank you. I'm really new to Xamarin development

i would prefer a way to do it on xamarin forms, but starting with something that will prompt android user, because for iOS i have no simulator

this page or this .

bob269
  • 115
  • 1
  • 13

3 Answers3

3

so after going through several tutorials and answers all over the internet i finally was able to find to accomplish what i wanted to achieve,

i used a dependency service as one of the answers indicated here How to open setting from our application in xamarin

there are few things that were not mentioned like registering the interface in order to use it in platform specific projects.

here is the code for anyone who needs it

the Interface : I called my Interface 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();

    }

the form that has a button I called it 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>

then the 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");
            }


            // 
        }
    }
}

Then I have this Class Placed on the Android Specific Platform 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
            }
        }


    }
}

`

bob269
  • 115
  • 1
  • 13
1

If you are talking about getting the user to grant location permission, the easiest way to do it is to use the permissions plugin. This allows you to both request and check on a particular permission.

The permission plugin and full documentation can he found here

You will then be able to do the following:

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;
}
Steve Chadbourne
  • 6,873
  • 3
  • 54
  • 82
  • thank you for your reply, but what i need is for the user to be prompted to Enable Location Service either by just pressing yes somewhere or by going to the Location Settings page and enable location. as for the above example i had already done that and its working , but it works only when the location in the device is already enabled. the extra feature i want for my App is to ask the user to switch on location service when its off – bob269 Feb 01 '18 at 07:40
  • Has anyone accomplished this in Xamarin forms... Even if it works on android only but the solution is multi-platform – bob269 Feb 02 '18 at 04:48
  • I found the Solution, i will share later today when am off work. thanks to all who contributed, i had to use a mix of things – bob269 Feb 07 '18 at 08:42
0

First

Third

the Images show the screens up to the Settings page

bob269
  • 115
  • 1
  • 13