Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android,Xamarin:让我的应用程序等待用户输入以允许权限_Android_Xamarin_Xamarin.android - Fatal编程技术网

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

Android,Xamarin:让我的应用程序等待用户输入以允许权限,android,xamarin,xamarin.android,Android,Xamarin,Xamarin.android,这可能是个问题,但无论如何: 我要求用户允许某些权限。然而,该应用程序速度如此之快,它不会等待用户欺骗是否允许它或拒绝它。它将继续,然后崩溃,因为用户甚至没有完全阅读弹出窗口。这是代码的一部分: if ((int)Build.VERSION.SdkInt < 23) // for phones that don't need permissions at runtime { var GPS = new FindTheLocatio

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

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

        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;

        }
if((int)Build.VERSION.SdkInt<23)//用于运行时不需要权限的手机
{
var GPS=新发现的位置(本);
GPS.InitializeLocationManager();
GPS.StartLocationUpdates();
}否则
{
Android.Support.V4.App.ActivityCompat.RequestPermissions(这个新字符串[]){
Android.Manifest.Permission.AccessFineLocation,
Android.Manifest.Permission.AccessMockLocation,
Android.Manifest.Permission.accessLocation
}, 1);
var GPS=新发现的位置(本);
GPS.InitializeLocationManager();
GPS.StartLocationUpdates();
返回;
}
如何让我的应用程序停止并等待definitv输入

谢谢:)' 编辑:


是的,我知道可能会把这些方法写进简历里。但我只是想知道是否还有其他办法

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

1) 重写OnRequestPermissionsResult(int-requestCode,字符串[]权限,权限[]grantResults)

2) 将您的GPS代码移动到那里,并仅在用户授予适当权限的情况下运行它

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


有关完整示例,请查看此处:。最重要的部分是处理许可请求,在文章的下半部分。

接受的answear听起来像是一种解决办法,但并不总是将GPS代码放在那里的最佳选择。如果您需要请求更多不同类型的权限,该怎么办

我建议在这里执行
ManualResetEvent

1) 假设在我们的
DroidPermissionService
中,我们初始化
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;
    }
3) 主要活动

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
            });
    }

请记住,我使用自己创建的接口来处理订阅和发布事件,所以我可能会在这里介绍一些小错误。但最重要的是使用的想法
ManualResetEvent
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
            });
    }