Как проверить наличие network_provider и gps_provider в формах Xamarin? - PullRequest
0 голосов
/ 12 ноября 2018

Я использую Xamarin.Forms и работаю с проектом, который будет работать на Android и Iphone.Моя структура проекта (если эта информация полезна?) - это три проекта «MyApp», «MyApp.Android» и «MyApp.iOS» внутри одного решения.

Сейчас я использую разные плагины, такие как Xam.Plugin.Geolocator и Plugin.Geofencing.Eddy для того, чтобы использовать геозону, но я сталкиваюсь с некоторыми проблемами (как указано в этом другом вопросе Геозона для кроссплатформенного ксамарина ).

Прямо сейчас яхотите проверить, сможет ли геозона работать, проверив наличие GPS_PROVIDER и NETWORK_PROVIDER, как я могу этого добиться?Прямо сейчас я могу только проверить, включено ли Местоположение, но не какой провайдер.

public bool IsLocationAvailable()
            {
                if (!CrossGeolocator.IsSupported)
                    return false;
                if (!CrossGeolocator.Current.IsGeolocationEnabled)
                    return false;
                if (!CrossGeolocator.Current.IsGeolocationAvailable)
                    return false;
                if (!CrossGeofencing.IsSupported)
                    return false;
                return true;
            }

Прямо сейчас, если провайдер местоположения установлен на «Только GPS», он выдает ошибку из-за этого, но я не уверенкак поймать и справиться с этим.Я видел некоторые другие примеры и вопросы, но они предназначены исключительно для Android, и я не уверен, как их реализовать, если я уже использую эти плагины и работаю в основном над проектом форм xamarin (он же MyApp) вместо андроида ("MyApp.Android ")

Извините за большое изображение, я не уверен, как изменить его размер!

1 Ответ

0 голосов
/ 13 ноября 2018

Вы всегда можете запустить специфичный для платформы код в вашем общем проекте «MyApp», используя Служба зависимостей Xamarin.Forms .

Основная идея заключается в том, что вы создаете интерфейс в своем общем проекте, назовем его IGetLocationProvider:

public interface IGetLocationProvider {
    string GetProvider (); 
}

Затем в проектах для Android, MyApp.Android и / или iOS, MyApp.iOS, вы реализуете интерфейс в классе и добавляете в него атрибут Dependency. Но сначала вам понадобится доступ к контексту приложения Android. Самый простой способ сделать это доступным глобально в проекте приложения для Android - добавить статическую переменную в класс MainActivity и установить ее в OnCreate:

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    public static Context Context;
    ... 
    protected override void OnCreate(Bundle savedInstanceState)
    {
        ...
        MainActivity.Context = this;

    }
}

Теперь вот специальная платформа Dependency Service для Android, которая будет возвращать строку с доступными поставщиками местоположения через запятую:

using System;
using GetLP.Droid;
using Xamarin.Forms;
using Android.Locations;

[assembly: Dependency(typeof(GetLocationProvider))]
namespace GetLP.Droid
{
    public class GetLocationProvider : IGetLocationProvider
    {
        public string GetProvider()
        {
            string returnString = "";

            LocationManager manager = (LocationManager)MainActivity.Context.GetSystemService(Android.Content.Context.LocationService);
            bool gpsProviderEnabled = manager.IsProviderEnabled(LocationManager.GpsProvider);
            bool networkProviderEnabled = manager.IsProviderEnabled(LocationManager.NetworkProvider);
            bool passiveProviderEnabled = manager.IsProviderEnabled(LocationManager.PassiveProvider);

            returnString += gpsProviderEnabled ? "GPS," : ",";
            returnString += networkProviderEnabled ? "Network," : ",";
            returnString += passiveProviderEnabled ? "Passive" : "";

            return returnString;
        }
    }
}

Теперь вы можете вызывать GetProvider из вашего общего кода:

string providers = DependencyService.Get<IGetLocationProvider>().GetProvider();

Переменная providers будет разделять запятыми строку доступных провайдеров, например, если GSP и Passive доступны, строка будет «GPS, Passive», а если Network и Passive доступны, строка будет «, Network, Passive». Конечно, вы можете изменить GetProvider так, чтобы он возвращал массив или список или что угодно, просто убедитесь, что это то, что доступно на всех платформах, то есть не возвращайте LocationManager, так как это тип, специфичный для Android.

Для iOS ничего подобного нет. iOS решает, какие методы использовать для определения местоположения, а какие использует ОС, недоступно разработчику приложения при получении местоположения, поэтому вы можете вызывать эту службу зависимостей только при работе на Android.

...