Android,Xamarin:让我的应用等待用户输入以允许权限

时间:2017-06-26 12:10:36

标签: android xamarin xamarin.android

这可能是一个菜鸟问题,但无论如何:

我要求用户允许某些权限。但是,该应用程序非常快,它不会等待用户欺骗是否允许它或否认它。它将继续然后崩溃,因为用户甚至没有完全阅读弹出窗口。这是代码的一部分:

        if ((int)Build.VERSION.SdkInt < 23) // for phones that don't need permissions at runtime 

        {
            var GPS = new FindTheLocation(this);
            GPS.InitializeLocationManager();
            GPS.StartLocationUpdates();
        } else
        {
            Android.Support.V4.App.ActivityCompat.RequestPermissions(this, new String[] {
                                                                                          Android.Manifest.Permission.AccessFineLocation,
                                                                                          Android.Manifest.Permission.AccessMockLocation,
                                                                                          Android.Manifest.Permission.AccessCoarseLocation
                                                                                        }, 1);

                var GPS = new FindTheLocation(this);
                GPS.InitializeLocationManager();
                GPS.StartLocationUpdates();
                return;

        }

如何让我的应用程序停止并等待definitv输入?

感谢:)' 编辑:

是的,我知道可能会将这些方法放入OnResume中。但我只是想知道是否还有其他方法。

2 个答案:

答案 0 :(得分:1)

这里的问题是,在调用RequestPermissions方法后,您的应用会立即继续执行。你应该做的是:

1)覆盖OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)

2)在那里移动你的GPS代码,只有在用户授予了适当的权限时才运行它。

通过上述更改,您的GPS代码将仅在用户授予/拒绝权限后运行,因为Android仅在关闭对话框后才会调用OnRequestPermissionsResult方法。

有关完整示例,请查看此处:Requesting Runtime Permissions in Android Marshmallow。最重要的部分是处理权限请求,在本文的下半部分。

答案 1 :(得分:0)

可接受的回答听起来像是解决方法,但并非总是如此,将GPS代码放在那里可能是最好的选择。如果您需要更多不同的权限怎么办?

我建议在此处实施DroidPermissionService

1)假设我们在mre中初始化了public async Task<bool> TryAcquireReadPhoneStatePermission() { _mre.Reset(); var isPhoneStatePermissionGranted = ContextCompat.CheckSelfPermission(Android.App.Application.Context, Android.Manifest.Permission.ReadPhoneState) == (int)Permission.Granted; if (isPhoneStatePermissionGranted) { return true; } RequestPermission(Manifest.Permission.ReadPhoneState, PermissionIdentifier.ReadPhoneState); _mre.WaitOne(); return IsReadPhoneStatePermissionGrated; } ,并有一种方法来请求许可

Subscribe

2)同样,在同一服务中,我们OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)处理在句柄public void Subscribe() { MessagingCenter.Subscribe(sub, string.Empty, (PermissionChangedEvent e) => { IsReadPhoneStatePermissionGrated = isPermissionGranted; _mre.Set()); } } 时将调用的某种事件 例如,订阅代码:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
    {
        base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        if(grantResults.Length != 1)
        {
            return;
        }
        var isPermissionGranted = grantResults[0] == Permission.Granted;
        MessagingCenter.Send(
            new PermissionChangedEvent(PermissionIdentifier.Location, positionStatus: locationStatus)
                {
                    IsPermissionGranted = isPermissionGranted
            });
    }

3)在MainActivity中

import numpy as np
x = [0, 1, 2, 3, 4, 4, 5]
y = [0, 1, 3, 3, 5, 6, 7]

def integrate(x, y):
    area = np.trapz(y=y, x=x)
    return area
print(integrate(x, y))