【问题标题】:App Crashing when requesting Location Permission from Users on Runtime in Xamarin Android在 Xamarin Android 的运行时向用户请求位置权限时应用程序崩溃
【发布时间】:2019-04-03 16:25:17
【问题描述】:

当我移动到另一个选项卡时,我只是请求位置的运行时权限(ACCESS_FINE_LOCATION),当时应用程序崩溃了。

private void RequestPermissions()
        {
            try
            {
                bool shouldProvideRationale = Android.Support.V4.App.ActivityCompat.ShouldShowRequestPermissionRationale(Activity, Manifest.Permission.AccessFineLocation);

                if (shouldProvideRationale)
                {
                    Log.Info(Tag, "Displaying permission rationale to provide additional context.");
                }
                else
                {
                    Android.Support.V4.App.ActivityCompat.RequestPermissions(Activity, new String[] { Manifest.Permission.AccessFineLocation }, 1);
                    Log.Info(Tag, "Requesting permission");
                    // StartLocationPermissionRequest();
                }
            }
}

我需要弹出窗口一直保留到我响应该权限。

【问题讨论】:

    标签: android xamarin.android request location android-permissions


    【解决方案1】:

    您是否在清单中声明了许可? 如果没有,请转到 AndroidManifest.xml 并添加:

    【讨论】:

    • 是的,我在清单中声明了此权限,但应用程序仍然崩溃
    【解决方案2】:

    对于完全相同的事情,我有一个可行的解决方案,如下所示:

    在您的 OnCreate 方法中检查现有权限:

     if (!(CheckPermissionGranted(Manifest.Permission.AccessCoarseLocation) &&
                CheckPermissionGranted(Manifest.Permission.AccessFineLocation)))
            {
                RequestLocationPermission();
            }
            else
            {
                InitializeLocationManager();
            }
            InitPageWidgets();
    

    Check permission Granted 是这样一种方法:

     [Export]
        public bool CheckPermissionGranted(string Permissions)
        {
            // Check if the permission is already available.
            if (ActivityCompat.CheckSelfPermission(this, Permissions) != Permission.Granted)
            {
                return false;
            }
            else
            {
                return true;
            }
    
    
        }
    

    请求权限代码如下所示:

      private void RequestLocationPermission()
        {
            if (ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.AccessFineLocation))
            {
                // Provide an additional rationale to the user if the permission was not granted
                // and the user would benefit from additional context for the use of the permission.
                // For example if the user has previously denied the permission.
                ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);
    
            }
            else
            {
                // Camera permission has not been granted yet. Request it directly.
                ActivityCompat.RequestPermissions(this, PermissionsLocation, REQUEST_LOCATION);
            }
        }
    

    一旦您接受或拒绝此权限,此方法将被调用:

    public override void OnRequestPermissionsResult(int requestCode, string[] permissions,
                         Android.Content.PM.Permission[] grantResults)
        {
            Log.Info(Tag, "onRequestPermissionResult");
            if (requestCode == RequestPermissionsRequestCode)
            {
                if (grantResults.Length <= 0)
                {
                    // If user interaction was interrupted, the permission request is cancelled and you
                    // receive empty arrays.
                    Log.Info(Tag, "User interaction was cancelled.");
                }
                else if (grantResults[0] == PermissionChecker.PermissionGranted)
                {
                    // Permission was granted.
                    Service.RequestLocationUpdates();
                }
                else
                {
                    // Permission denied.
                    SetButtonsState(false);
                    Toast.MakeText(this, "Permission Denied", ToastLength.Long).Show();
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-09-15
      • 2017-07-05
      • 2019-06-25
      • 2016-12-22
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多