Ben*_*ach 5 android unity-game-engine android-permissions
我正在开发一个目标平台为 Android 的 Unity(版本 2019.1.11)项目,我需要拥有以下权限才能使我的应用程序正常工作:
android.permission.CAMERA
android.permission.RECORD_AUDIO
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_PHONE_STATE
Run Code Online (Sandbox Code Playgroud)
Unity文档指定了这种方式来请求Android权限。我的目标是在应用程序启动期间对所有必需的权限进行初步检查,如下所示:
private void AskPermissions()
{
#if UNITY_ANDROID
if (!Permission.HasUserAuthorizedPermission(Permission.Microphone))
{
Permission.RequestUserPermission(Permission.Microphone);
}
if (!Permission.HasUserAuthorizedPermission(Permission.Camera))
{
Permission.RequestUserPermission(Permission.Camera);
}
if (!Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite))
{
Permission.RequestUserPermission(Permission.ExternalStorageWrite);
}
if (!Permission.HasUserAuthorizedPermission("android.permission.READ_PHONE_STATE"))
{
Permission.RequestUserPermission("android.permission.READ_PHONE_STATE");
}
#endif
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用:应用程序仅显示第一个未授权权限的对话框,而不显示随后检查的未授权权限的对话框。
如何确保始终检查所有权限?
似乎Permission.RequestUserPermission以某种方式异步工作,并且当已经显示对话框时不会显示对话框 - 因此在找到第一个未授权的权限后简单地跳过所有其他权限。
我可以这样绕过这个问题:
private IEnumerator AskForPermissions()
{
#if UNITY_ANDROID
List<bool> permissions = new List<bool>() { false, false, false, false };
List<bool> permissionsAsked = new List<bool>() { false, false, false, false };
List<Action> actions = new List<Action>()
{
new Action(() => {
permissions[0] = Permission.HasUserAuthorizedPermission(Permission.Microphone);
if (!permissions[0] && !permissionsAsked[0])
{
Permission.RequestUserPermission(Permission.Microphone);
permissionsAsked[0] = true;
return;
}
}),
new Action(() => {
permissions[1] = Permission.HasUserAuthorizedPermission(Permission.Camera);
if (!permissions[1] && !permissionsAsked[1])
{
Permission.RequestUserPermission(Permission.Camera);
permissionsAsked[1] = true;
return;
}
}),
new Action(() => {
permissions[2] = Permission.HasUserAuthorizedPermission(Permission.ExternalStorageWrite);
if (!permissions[2] && !permissionsAsked[2])
{
Permission.RequestUserPermission(Permission.ExternalStorageWrite);
permissionsAsked[2] = true;
return;
}
}),
new Action(() => {
permissions[3] = ermission.HasUserAuthorizedPermission("android.permission.READ_PHONE_STATE");
if (!permissions[3] && !permissionsAsked[3])
{
Permission.RequestUserPermission("android.permission.READ_PHONE_STATE");
permissionsAsked[3] = true;
return;
}
})
};
for(int i = 0; i < permissionsAsked.Count; )
{
actions[i].Invoke();
if(permissions[i])
{
++i;
}
yield return new WaitForEndOfFrame();
}
#endif
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12219 次 |
| 最近记录: |