android - programacion - Mostrar solicitud para conocer la ubicación
manual de programacion android pdf (2)
Pero ese aviso no se muestra cuando tengo este sitio web en un WebView (desde la aplicación).
Si lo hice bien, estás envolviendo esto en una aplicación. Esa no es la experiencia de usuario esperada desde una aplicación móvil. su aplicación debe usar los permisos de ubicación de la plataforma (por ejemplo, iOS, Android) para obtener la aprobación del usuario.
Xamarin te permitirá acceder a la ubicación en cada plataforma de manera diferente. Si la aplicación Xamarin tiene acceso a la ubicación, la vista web debería heredar estos permisos. Por lo tanto, podría valer la pena probar esta receta e intentar ubicar el lugar antes de abrir la propia vista web
Estoy usando el controlador Xamarin WebView para mostrar un sitio web (en iOS / Android). La página de inicio del sitio web solicita acceso a la ubicación del dispositivo. Pero ese aviso no se muestra cuando tengo este sitio web en un WebView (desde la aplicación). Cuando abro este sitio en el navegador, desde el mismo dispositivo móvil muestra el cuadro de mensaje. Me pregunto si es posible tener tales avisos en Xamarin WebView.
Aquí hay un prompt de ejemplo.
Esto es todo lo que tengo en la aplicación Xamarin.
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:nCollar"
x:Class="nCollar.MainPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<OnPlatform.iOS>0,20,0,0</OnPlatform.iOS>
<OnPlatform.Android>0,0,0,0</OnPlatform.Android>
<OnPlatform.WinPhone>0,0,0,0</OnPlatform.WinPhone>
</OnPlatform>
</ContentPage.Padding>
<WebView x:Name="webView"
Grid.Row="0"
VerticalOptions="FillAndExpand"
Source="https://www.ncollar.com.au/"/>
</ContentPage>
ACTUALIZACIÓN 1
Androide
He intentado con la solución mencionada en esta publicación, pero aún así no muestra el mensaje.
WebViewRenderer.cs
using Android.Webkit;
using Xamarin.Forms.Platform.Android;
[assembly: Xamarin.Forms.ExportRenderer(typeof(TestApp.Controls.WebView), typeof(TestApp.Droid.Renderers.WebViewRenderer))]
namespace TestApp.Droid.Renderers
{
public class WebViewRenderer : Xamarin.Forms.Platform.Android.WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (this.Control == null)
{
return;
}
var webView = this.Element as TestApp.Controls.WebView;
if (webView == null)
{
return;
}
// webView. ings.JavaScriptEnabled = true;
this.Control.Settings.DomStorageEnabled = true;
this.Control.Settings.DisplayZoomControls = true;
this.Control.Settings.BuiltInZoomControls = true;
this.Control.Settings.SetGeolocationEnabled(true);
this.Control.Settings.JavaScriptCanOpenWindowsAutomatically = true;
this.Control.SetWebViewClient(new GeoWebViewClient());
this.Control.SetWebChromeClient(new GeoWebChromeClient());
}
}
public class GeoWebChromeClient : WebChromeClient
{
public override void OnGeolocationPermissionsShowPrompt(string origin, GeolocationPermissions.ICallback callback)
{
callback.Invoke(origin, true, false);
}
}
public class GeoWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(WebView view, string url)
{
view.LoadUrl(url);
return true;
}
}
}
Manifiesto
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application android:label="TestApp.Android"></application>
</manifest>
iOS
NSLocationWhenInUseUsageDescription
en el archivo plist, pero no hubo diferencia.
Ejemplo de aplicación que hace algo similar
Respuesta actualizada (con código)
En el caso de Android , necesitará un procesador personalizado para su control WebView. (ref: esencia )
public class ExtendedWebViewRenderer : WebViewRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.WebView> e)
{
base.OnElementChanged(e);
if (e.OldElement != null || Element == null)
{
return;
}
Control.Settings.JavaScriptEnabled = true;
Control.Settings.SetGeolocationEnabled(true);
Control.Settings.SetGeolocationDatabasePath(Control.Context.FilesDir.Path);
Control.SetWebViewClient(new CustomWebViewClient());
Control.SetWebChromeClient(new CustomChromeClient(Control.Context));
}
}
public class CustomWebViewClient : WebViewClient
{
public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, string url)
{
view.LoadUrl(url);
return true;
}
}
public class CustomChromeClient : WebChromeClient
{
private readonly Context _context;
public CustomChromeClient(Context context)
{
_context = context;
}
public override void OnGeolocationPermissionsShowPrompt(string origin, GeolocationPermissions.ICallback callback)
{
const bool remember = false;
var builder = new AlertDialog.Builder(_context);
builder.SetTitle("Location")
.SetMessage(string.Format("{0} would like to use your current location", origin))
.SetPositiveButton("Allow", (sender, args) => callback.Invoke(origin, true, remember))
.SetNegativeButton("Disallow", (sender, args) => callback.Invoke(origin, false, remember));
var alert = builder.Create();
alert.Show();
}
}
Permisos manifiestos
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
Muestra de uso
<StackLayout Margin="30" BackgroundColor="#ededed">
<Label Text="WebView location prompt sample" Margin="15" HorizontalOptions="Center" />
<local:ExtendedWebView x:Name="webView" Source="https://www.yellowpages.com/" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />
</StackLayout>
Y, en el caso de iOS , debe configurar la descripción de NSLocationWhenInUseUsageDescription
en el archivo info.plist
.
Y muestra el mensaje.
La muestra del código completo se puede encontrar en este enlace
Respuesta original
En el caso de Android, debería poder resolver esto agregando un renderizador específico de la plataforma para WebView e implementar el manejo de permisos agregando un WebChromeClient personalizado .
En el caso de iOS, debe agregar la descripción NSLocationWhenInUseUsageDescription en su lista de información