【问题标题】:no geolocation authorization with SDK28 webviewSDK28 webview没有地理定位授权
【发布时间】:2021-05-30 10:20:19
【问题描述】:

我在使用我的代码激活 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();
    }
}



}

我缺少一些要完成的东西,但我不是该领域的专业人士,无法使其发挥作用。 我接受任何评论或信息。提前致谢

【问题讨论】:

  • 从你的描述中,你想使用gps,但是我看不到你在哪里请求gps权限,你需要在你使用它之前通过后面的代码请求它。
  • 如何申请授权?我是 C# 新手,我仍然缺乏一些概念,但我很快就能从错误中吸取教训。
  • public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); }
  • ActivityCompat.RequestPermissions(this, new String[] { Manifest.Permission.AccessFineLocation, Manifest.Permission.AccessCoarseLocation }, 1001);
  • 我添加了这些行,它似乎可以工作,但无论如何它不是很干净

标签: c# android webview xamarin.android geolocation


【解决方案1】:

Android 应用程序在自己的沙盒中运行,出于安​​全原因,它们无法访问设备上的某些系统资源或硬件。用户必须明确授予应用程序权限,然后才能使用这些资源。例如,未经用户明确许可,应用程序无法访问设备上的 GPS。

对于面向 Android 5.1(API 级别 22)或更低版本的应用,权限请求在应用安装时发生。

Android 6.0 (API level 23)开始,用户被赋予了更多的权限控制,需要在运行时请求权限。

首先,您需要在 AndroidManifest.xml 中添加 AccessFineLocationAccessCoarseLocation 权限。

然后在使用前在运行时请求权限。

 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会通过回调方法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);
    }

更多关于运行时权限的详细信息,你可以看看:

https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/permissions?tabs=windows#runtime-permission-checks-in-android-60

【讨论】:

  • @michael 任何更新,我提供一些关于运行时权限的代码和详细信息。如果它解决了您的问题,请记得标记为答案。
猜你喜欢
  • 2018-07-18
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多