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