2
votes

Autorisations d'exécution Android avec unity 2018.3

La nouvelle méthode:

Permission.RequestUserPermission()

arrête-t-elle le cycle de trame? Utilisation de Unity 2018.3.0f2. La méthode peut être trouvée dans l'espace de noms Android. Voici le lien vers la ducumentation: https: // docs. unity3d.com/2018.3/Documentation/ScriptReference/Android.Permission.RequestUserPermission.html


0 commentaires

3 Réponses :


0
votes

Non, il revient immédiatement. Mais vous pouvez l'envelopper dans une coroutine au lieu d'interroger le résultat en utilisant yield return "demandez votre permission"

https://docs.unity3d.com/ScriptReference/Application.RequestUserAuthorization.html

edit: mélangez-les. RequestUserPermission sera également renvoyé immédiatement. Je suppose que vous commencez cela une fois et interrogez le résultat dans Update () jusqu'à ce que ce soit vrai.

Cependant, cela ne devrait pas arrêter votre jeu. Pouvez-vous l'essayer et publier ici?



1
votes

J'ai donc beaucoup essayé et voici mon résultat dans le traitement de plusieurs demandes d'autorisation Android. Comme demandé, je le poste ici. J'utilise une simple gestion des événements pour afficher la boîte de dialogue Oui Non, mais vous pouvez également la placer ici. Tout est maintenant assez explicite. Cela fonctionne pour moi.

Pour répondre à ma question. L'appel RequestUserPErmission arrête votre application.

using UnityEngine;
using System.Collections.Generic;

#if PLATFORM_ANDROID
using UnityEngine.Android;
#endif

public class PermissionTest : MonoBehaviour {

    public static bool PermissionCheckInProgress = false;

    private Dictionary<string, string> m_msgTexts = new Dictionary<string, string>();

#if PLATFORM_ANDROID

    private void OnEnable() {
        App.MsgSystem.MsgSystem.MSG_CONFIRMED.AddListener( HandleAnswer );
    }

    private void OnDisable() {
        App.MsgSystem.MsgSystem.MSG_CONFIRMED.RemoveListener( HandleAnswer );
    }

    private void Start() {
        m_msgTexts.Add( Permission.Camera, "That is why i need the camera." );
        m_msgTexts.Add( Permission.FineLocation, "That is why i need the GPS." );
        m_msgTexts.Add( Permission.ExternalStorageWrite, "That is why i need the SD card." );

        //initial perission request
        foreach (KeyValuePair<string, string> entry in m_msgTexts) {
            if (!Permission.HasUserAuthorizedPermission( entry.Key )) {
                Permission.RequestUserPermission( entry.Key );
            }
        }
    }

    private void Update() {
        if (App.AppManager.Instance._settings._DatenschutzAccepted ) {
            if (!PermissionCheckInProgress) {
                foreach (KeyValuePair<string, string> entry in m_msgTexts) {
                    if (entry.Value != "done") {
                        AskForPermission( entry.Key, entry.Value );
                    }
                }
            }
        }
    }

    private void AskForPermission(string PermissionType, string msg) {
        if (!Permission.HasUserAuthorizedPermission( PermissionType ) && !PermissionCheckInProgress) {

            // The user denied permission to use the asked permission type.
            // so send a msg in our msgsystem to ask again with a description why we need it
            // then wait for the answer

            App.MsgSystem.MsgSystem.MSG_PROMPT.Dispatch( msg, PermissionType );
            PermissionCheckInProgress = true;
            m_msgTexts[ PermissionType ] = "done";
        }
    }

    /// <summary>
    /// Callback from the yes or no dialog
    /// </summary>
    /// <param name="handle"></param>
    private void HandleAnswer(string handle) {
        Permission.RequestUserPermission( handle );

        PermissionCheckInProgress = false;
    }

#endif
}


0 commentaires

1
votes

D'après mon expérience, cette requête suspend le jeu, mais pas avant le retour de la méthode RequestUserPermission (l'image suivante, je pense). Donc, ce modèle ne fonctionne pas:

if (!Permission.HasUserAuthorizedPermission(...)) 
{
    Permission.RequestUserPermission(...);
    if (Permission.HasUserAuthorizedPermission(...)) 
    {
        // never happens
    }
}

Vous devrez interroger HasUserAuthorizedPermission pour vérifier si vous avez la permission.


1 commentaires

C'est le bon modèle. Si vous utilisez Tasks, Coroutines ou toute méthode asynchrone, vous pouvez maintenir jusqu'à la fin de l'image via yield return null ou Task.Delay () ou quelque chose d'équivalent. Ensuite, le code que vous souhaitez déclencher après les autorisations déclenchera la trame suivante pour laquelle vous avez activé ou désactivé les autorisations.