Xamarin Android - API 27 RequestPermission - PullRequest
       30

Xamarin Android - API 27 RequestPermission

0 голосов
/ 23 октября 2018

Я использую следующий код для запроса разрешений для FineLocation / CoarseLocation и камеры:

protected override void OnResume()
        {
            base.OnResume();
            txt_TrashSubmitDescriptionTitle = FindViewById<TextView>(Resource.Id.txt_TrashSubmitDescriptionTitle);

            var c = ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == (int)Permission.Granted;
            var y = ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted;
            var z = ContextCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == (int)Permission.Granted;

            if (c && y && z)
            {
                StartLocationService();


            }
            else
            {
                var requiredPermissions = new string[] { Manifest.Permission.AccessFineLocation, Manifest.Permission.AccessCoarseLocation, Manifest.Permission.Camera };
                if (GeneralFunctions.CheckShouldShowRequestPermissionRationaleForPermissions(this, requiredPermissions))
                {
                    // 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.

                    Snackbar.Make(txt_TrashSubmitDescriptionTitle,
                                   Resource.String.permission_location_rationale,
                                   Snackbar.LengthIndefinite)
                            .SetAction(Resource.String.ok, new Action<Android.Views.View>(delegate (Android.Views.View x) { ActivityCompat.RequestPermissions(this, requiredPermissions, 2); })).Show();
                }
                else
                {
                    ActivityCompat.RequestPermissions(this, requiredPermissions, 2);
                }
            }
        }

Эта функция проверяет, должен ли отображаться PermissionRadiale:

public static bool CheckShouldShowRequestPermissionRationaleForPermissions(Activity _activity, string[] requiredPermissions)
        {
            bool returnBool = false;
            foreach(string _permission in requiredPermissions)
            {
                returnBool = ActivityCompat.ShouldShowRequestPermissionRationale(_activity, _permission);
            }
            return returnBool;
        }

Функция OnResume продолжает вызываться снова и снова без конкретной ошибки, и я не знаю, почему.

Кто-то знает, почему OnResume продолжает вызываться?

1 Ответ

0 голосов
/ 15 марта 2019

Во-первых, убедитесь, что у вас есть права доступа, установленные в вашем манифесте:

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

Без них приложение, как и вы с кодом в OnResume (), перейдет в бесконечное OnResume () петля.По крайней мере, так было в моем тестовом приложении, где я нацеливался на Android 9.0.

После того, как они установлены, код работает достаточно хорошо , если , то пользователь предоставляет все привилегии.Но я все же переместил бы код RequestPermissions () из OnResume () в OnCreate () или OnStart ().Одна из причин заключается в том, что пользователь может установить флажок «Не спрашивать снова», в этом случае это может привести к бесконечному циклу.

Для некоторого фона ... при отображении диалогового окна RequestPermissions () ваша деятельностьзапускает OnPause (), и когда закрывается диалоговое окно RequestPermissions, OnRequestPermissionsResult () и OnResume () вызываются.Это также происходит в тех случаях, когда RequestPermissions () запускается, но диалог не отображается.

Надеюсь, это поможет!

...