SDK28 webview 没有地理定位授权
no geolocation authorization with SDK28 webview
我在使用我的代码激活 android 上的 gps 时遇到问题。
我有我的 AlertDialog,它问我是或否,但之后没有采取任何行动。
我有一个“应用程序没有足够的地理定位权限”错误。
这是我意识到的:
清单:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
程序集信息:
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessFineLocation)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessCoarseLocation)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessWifiState)]
[assembly: UsesPermission(Android.Manifest.Permission.ControlLocationUpdates)]
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessMockLocation)]
[assembly: UsesPermission(Android.Manifest.Permission_group.Location)]
[assembly: UsesPermission(Android.Manifest.Permission.SetAlarm)]
[assembly: UsesFeature("android.hardware.location", Required = false)]
[assembly: UsesFeature("android.hardware.location.gps", Required = false)]
[assembly: UsesFeature("android.hardware.location.network", Required = false)]
主要活动:
namespace alerte
{
public class MainActivity : AppCompatActivity
{
private void Getaffichagemap(string X, string Y, string Ldep, string Lcom, string Lco, string liststationmap)
{
string myHtml = "bla bla bla";
MapView.Settings.JavaScriptEnabled = true;
MapView.Settings.SetGeolocationEnabled(true);
MapView.Settings.SetGeolocationDatabasePath(MapView.Context.FilesDir.Path);
MapView.SetWebChromeClient(new CustomChromeClient(MapView.Context));
MapView.LoadDataWithBaseURL("https://null", myHtml, "text/html", "UTF-8", null);
}
}
public class CustomChromeClient : WebChromeClient
{
private readonly Context _context;
public CustomChromeClient(Context context)
{
_context = context;
}
public override void OnGeolocationPermissionsShowPrompt(string origin, Android.Webkit.GeolocationPermissions.ICallback callback)
{
var builder = new AlertDialog.Builder(_context);
builder.SetTitle("Localisation")
.SetMessage(string.Format("Utiliser votre position actuelle", origin))
.SetPositiveButton("Oui", (sender, args) => callback.Invoke(origin, true, false))
.SetNegativeButton("Non", (sender, args) => callback.Invoke(origin, false, false));
var alert = builder.Create();
alert.Show();
}
}
}
我缺少一些要完成的东西,但我不是这个领域的专家,无法让它发挥作用。
我接受任何评论或信息。提前致谢
Android 应用程序 运行 在他们自己的沙箱中并且出于安全原因无法访问设备上的某些系统资源或硬件。用户必须明确授予应用程序权限才能使用这些资源。例如,未经用户明确许可,应用程序无法访问设备上的 GPS。
对于针对Android 5.1(API 22 级)或更低 的应用,权限请求在应用安装时发生。
从 Android 6.0(API 级别 23) 开始,用户获得了更多的权限控制权,需要在 运行时间。
首先,您需要为 AndroidManifest.xml.
添加 AccessFineLocation 和 AccessCoarseLocation 权限
然后在使用前 运行 时间请求许可。
private void checklocationpermission()
{
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
{
// We have permission, go ahead and use the device location.
}
else
{
// location permission is not granted. If necessary display rationale & request.
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.AccessFineLocation }, 1);
}
}
用户完成后,Android将return结果通过回调方法OnRequestPermissionResult发送给Activity。此方法是接口 ActivityCompat.IOnRequestPermissionsResultCallback 的一部分,必须由 Activity 实现。此接口只有一个方法 OnRequestPermissionsResult,Android 将调用该方法以通知 Activity 用户的选择。
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
更详细的Runtime Permission,你可以看看:
我在使用我的代码激活 android 上的 gps 时遇到问题。 我有我的 AlertDialog,它问我是或否,但之后没有采取任何行动。 我有一个“应用程序没有足够的地理定位权限”错误。 这是我意识到的:
清单:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
程序集信息:
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessFineLocation)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessCoarseLocation)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessWifiState)]
[assembly: UsesPermission(Android.Manifest.Permission.ControlLocationUpdates)]
[assembly: UsesPermission(Android.Manifest.Permission.Internet)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessMockLocation)]
[assembly: UsesPermission(Android.Manifest.Permission_group.Location)]
[assembly: UsesPermission(Android.Manifest.Permission.SetAlarm)]
[assembly: UsesFeature("android.hardware.location", Required = false)]
[assembly: UsesFeature("android.hardware.location.gps", Required = false)]
[assembly: UsesFeature("android.hardware.location.network", Required = false)]
主要活动:
namespace alerte
{
public class MainActivity : AppCompatActivity
{
private void Getaffichagemap(string X, string Y, string Ldep, string Lcom, string Lco, string liststationmap)
{
string myHtml = "bla bla bla";
MapView.Settings.JavaScriptEnabled = true;
MapView.Settings.SetGeolocationEnabled(true);
MapView.Settings.SetGeolocationDatabasePath(MapView.Context.FilesDir.Path);
MapView.SetWebChromeClient(new CustomChromeClient(MapView.Context));
MapView.LoadDataWithBaseURL("https://null", myHtml, "text/html", "UTF-8", null);
}
}
public class CustomChromeClient : WebChromeClient
{
private readonly Context _context;
public CustomChromeClient(Context context)
{
_context = context;
}
public override void OnGeolocationPermissionsShowPrompt(string origin, Android.Webkit.GeolocationPermissions.ICallback callback)
{
var builder = new AlertDialog.Builder(_context);
builder.SetTitle("Localisation")
.SetMessage(string.Format("Utiliser votre position actuelle", origin))
.SetPositiveButton("Oui", (sender, args) => callback.Invoke(origin, true, false))
.SetNegativeButton("Non", (sender, args) => callback.Invoke(origin, false, false));
var alert = builder.Create();
alert.Show();
}
}
}
我缺少一些要完成的东西,但我不是这个领域的专家,无法让它发挥作用。 我接受任何评论或信息。提前致谢
Android 应用程序 运行 在他们自己的沙箱中并且出于安全原因无法访问设备上的某些系统资源或硬件。用户必须明确授予应用程序权限才能使用这些资源。例如,未经用户明确许可,应用程序无法访问设备上的 GPS。
对于针对Android 5.1(API 22 级)或更低 的应用,权限请求在应用安装时发生。
从 Android 6.0(API 级别 23) 开始,用户获得了更多的权限控制权,需要在 运行时间。
首先,您需要为 AndroidManifest.xml.
添加 AccessFineLocation 和 AccessCoarseLocation 权限然后在使用前 运行 时间请求许可。
private void checklocationpermission()
{
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
{
// We have permission, go ahead and use the device location.
}
else
{
// location permission is not granted. If necessary display rationale & request.
ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.AccessFineLocation }, 1);
}
}
用户完成后,Android将return结果通过回调方法OnRequestPermissionResult发送给Activity。此方法是接口 ActivityCompat.IOnRequestPermissionsResultCallback 的一部分,必须由 Activity 实现。此接口只有一个方法 OnRequestPermissionsResult,Android 将调用该方法以通知 Activity 用户的选择。
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
更详细的Runtime Permission,你可以看看: