2017-02-17 3 views
1

Я пытаюсь включить веб-просмотр в приложении форм xamarin, чтобы получить текущие координаты GPS устройства Android. В настоящее время веб-просмотр/веб-сайт вернет координаты GPS при открытии в браузере Chrome на телефоне или ноутбуке, однако в приложении это не будет. Попытка заставить это работать как можно проще и расширить его после.Xamarin Forms WebView Geolocation issue

код до сих пор: 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="UITrial.Page2" 
      BackgroundColor = "#f0f0ea"> 
    <Label Text="{Binding MainText}" VerticalOptions="Center" HorizontalOptions="Center" /> 

    <WebView Source="https://danu6.it.nuigalway.ie/OliverInternetProgramming/project/Loginproject.html" /> 

</ContentPage> 

HTML PAGE:

<!DOCTYPE html> 
<html> 
<body> 

<p>Click the button to get your coordinates.</p> 

<button onclick="getLocation()">Try It</button> 

<p id="demo"></p> 

<script> 
var x = document.getElementById("demo"); 

function getLocation() { 
    if (navigator.geolocation) { 
     navigator.geolocation.watchPosition(showPosition); 
    } else { 
     x.innerHTML = "Geolocation is not supported by this browser.";} 
    } 

function showPosition(position) { 
    x.innerHTML="Latitude: " + position.coords.latitude + 
    "<br>Longitude: " + position.coords.longitude; 
} 
</script> 

</body> 
</html> 
+0

Вы настроили приложение, чтобы разрешить использование GPS? – SergioAMG

+0

Да настроили разрешения в манифесте Android, чтобы разрешить мелкие и грубые местоположения – Ollie

ответ

1

В настоящее время WebView/сайт будет возвращать GPS-координаты при открытии в браузере Chrome на телефоне или ноутбук, однако в приложении не будет.

Вам необходимо использовать пользовательскую форму WebChromeClient для WebView в проекте Droid. См. Android WebView Geolocation.

В Xamarin.Forms вы можете следовать приведенным ниже инструкциям для достижения этой цели:

  1. Создание пользовательского управления для WebView в проекте PCL:

    public class GeoWebView:WebView 
    { 
    } 
    

    И использовать его в Xaml:

    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
         xmlns:local="clr-namespace:WebViewFormsDemo" 
         x:Class="WebViewFormsDemo.MainPage"> 
    <local:GeoWebView 
        Source="https://danu6.it.nuigalway.ie/OliverInternetProgramming/project/Loginproject.html"></local:GeoWebView> 
    

  2. Создание пользовательского Renderer для GeoWebView в Droid проекта, как показано ниже:

    [assembly:ExportRenderer(typeof(GeoWebView),typeof(GeoWebViewRenderer))] 
    namespace WebViewFormsDemo.Droid 
    { 
        public class GeoWebViewRenderer:WebViewRenderer 
        { 
         protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e) 
         { 
          base.OnElementChanged(e); 
          Control.Settings.JavaScriptEnabled = true; 
          Control.SetWebChromeClient(new MyWebClient()); 
         } 
        } 
    
        public class MyWebClient : WebChromeClient 
        { 
         public override void OnGeolocationPermissionsShowPrompt(string origin, GeolocationPermissions.ICallback callback) 
         { 
          callback.Invoke(origin, true, false); 
         } 
        } 
    } 
    
  3. добавить разрешения к AndroidManifest.xml:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    

Тогда вы получите свое местоположение в WebView правильно.

0

Приветствия Элвиса удалось получить все работает, пришлось внести некоторые незначительные изменения, чтобы опубликуем все, что я сделал в деталях:

В App.xaml.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Xamarin.Forms; 

namespace WebViewFormsDemo 
{ 
    public partial class App : Application 
    { 
     public App() 
     { 
      InitializeComponent(); 
      MainPage = new MainPage(); 
     } 

    protected override void OnStart() 
    { 
     // Handle when your app starts 
    } 

    protected override void OnSleep() 
    { 
     // Handle when your app sleeps 
    } 

    protected override void OnResume() 
    { 
     // Handle when your app resumes 
    } 
} 

}

В MainPage.xaml убедитесь, что ваш сайт «https»

<?xml version="1.0" encoding="utf-8" ?> 
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" 
      xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
      xmlns:local="clr-namespace:WebViewFormsDemo" 
      x:Class="WebViewFormsDemo.MainPage"> 

    <local:GeoWebView 
    Source="https:// --- Your Website ----></local:GeoWebView> 

</ContentPage> 

Как сказал Элвис то необходимо создать настраиваемый элемент управления в проекте ПЛК. Щелкните правой кнопкой мыши и добавьте новый класс для этого.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Xamarin.Forms; 

namespace WebViewFormsDemo 
{ 
    public class GeoWebView : WebView 
    { 
    } 
} 

После этого создайте Custom Render в классе Droid. Были некоторые ошибки здесь изначально, в основном с отсутствующими «использующими» директивами, а также с ключевыми словами, необходимыми в «сборке».

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Android.App; 
using Android.Content; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using Android.Widget; 
using Xamarin.Forms; 
using Xamarin.Forms.Platform.Android; 
using Android.Webkit; 

[assembly: ExportRenderer(typeof(WebViewFormsDemo.GeoWebView), typeof(WebViewFormsDemo.Droid.GeoWebViewRenderer))] 
namespace WebViewFormsDemo.Droid 
{ 
    public class GeoWebViewRenderer : WebViewRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e) 
     { 
      base.OnElementChanged(e); 
      Control.Settings.JavaScriptEnabled = true; 
      Control.SetWebChromeClient(new MyWebClient()); 
     } 
    } 

    public class MyWebClient : WebChromeClient 
    { 
     public override void OnGeolocationPermissionsShowPrompt(string origin, GeolocationPermissions.ICallback callback) 
     { 
      callback.Invoke(origin, true, false); 
     } 
    } 
} 

После этих изменений все сработало отлично. Еще раз спасибо Элвису!

Смежные вопросы