这可能是一个菜鸟问题,但无论如何:
我要求用户允许某些权限。但是,该应用程序非常快,它不会等待用户欺骗是否允许它或否认它。它将继续然后崩溃,因为用户甚至没有完全阅读弹出窗口。这是代码的一部分:
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中。但我只是想知道是否还有其他方法。
答案 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))