C# Write Json sur android

Toutes les questions sur le développement Mobile, y compris la partie script.
maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

C# Write Json sur android

Message par maliimaloo » 13 Fév 2019 23:23

Bonjour, mon problème c'est que je n'arrive pas à écrire dans un fichier json sur mon application android, j'ai cherché par plusieurs moyens (Stream Writer, Httpwebrequest) après j'avais le même problème pour lire le json mais j'ai réussi avec UnityWebRequest, mais je sais pas comment écrire dans un fichier json avec UnityWebRequest sur android.

API JsonCRUD:

Code : Tout sélectionner

using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using UnityEngine;
using UnityEngine.Networking;

/// <summary>
/// API qui contient mes fonctions afin de Lire, Modifier, Reset un fichier Json
/// </summary>
public class JsonCRUDS
{
    /// <summary>
    /// Permet d'écrire dans un fichier json, ainsi que vérifier si il est sur android ou sur un ordinateur.
    /// </summary>
    /// <param name="pathFile">Chemin d'accès si tu es sur ordinateur</param>
    /// <param name="obj">L'objet qui sera converti en json</param>
    public void writeFile(string pathFile, object obj)
    {
        JsonData data = JsonMapper.ToJson(obj);

        UnityWebRequest writer = UnityWebRequest.Put(pathFile, data.ToString());
        writer.method = "POST";
        writer.SetRequestHeader("Content-Type", "application/json");
        writer.SetRequestHeader("Accept", "application/json");
        writer.SendWebRequest();

        using (StreamWriter streamWriter = new StreamWriter(pathFile))
        {
            string json = data.ToString();

            streamWriter.Write(json);
            streamWriter.Flush();
            streamWriter.Close();
        }
    }

    /// <summary>
    /// Permet de reset un fichier json, ainsi que vérifier si il est sur android ou sur un ordinateur.
    /// </summary>
    /// <param name="pathFileAndroid">Chemin d'accès si tu es sur android</param>
    /// <param name="pathFileNotAndroid">Chemin d'accès si tu es sur ordinateur</param>
    public void resetFile(string pathFileAndroid, string pathFileNotAndroid)
    {
        if (Application.platform == RuntimePlatform.Android)
        {
            File.WriteAllText(pathFileAndroid, string.Empty);
            return;
        }
        else
        {
            File.WriteAllText(pathFileNotAndroid, string.Empty);
            return;
        }

        //File.WriteAllText(pathFileNotAndroid, string.Empty);
        //return;
    }

    /// <summary>
    /// Permet de lire un fichier json sur android ou ordinateur.
    /// </summary>
    /// <param name="pathFile">Chemin d'accès au fichier Json</param>
    /// <returns>Renvoie l'intérieur du fichier json</returns>
    public string readFile(string pathFile)
    {
        UnityWebRequest reader = UnityWebRequest.Get(pathFile);
        reader.SendWebRequest();

        return reader.downloadHandler.text;
    }
}
Code Connexion:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
using LitJson;

/// <summary>
/// Class qui va gerer le system de connexion de mon utilisateur
/// </summary>
public class Connexion : MonoBehaviour
{
    [Header("Script")]
    private MessageListe message = new MessageListe();
    private JsonCRUDS jsonCRUDS = new JsonCRUDS();

    [Header("Panel PopUp")]
    public GameObject panelPop;

    [Header("InputField")]
    public InputField adresseMail;
    public InputField password;

    [Header("Boutton Accepter")]
    public Button accept;

    [Header("Boutton Close PopUp")]
    public Button close;

    [Header("Panel Login")]
    public GameObject panelLogin;

    [Header("Audio Source")]
    public AudioSource soundClick;

    [Header("Waiting Seconde")]
    public float waitSeconde;

    [Header("Script ProgressBar")]
    public GameObject scriptProgressBar;

    public Text textTest;

    private bool ok = true;
    /// <summary>
    /// Vérifier si au lancement de l'application le json [utilisateur.json] est vide, si oui -> je fais rien, si non -> lancement de ma barre de progression.
    /// </summary>
    public void Start()
    {
        string jsonFile = jsonCRUDS.readFile(Application.streamingAssetsPath + "/Utilisateur.json");

        if (jsonFile != "")
        {
            textTest.text = jsonFile;
            //scriptProgressBar.SetActive(true);
        }
        else
        {
            textTest.text = "Vide";
        }
    }

    /// <summary>
    /// Appeller mon IEnumerator ConnexionUser_() de ma class.
    /// </summary>
    public void ConnexionUser()
    {
        StartCoroutine(ConnexionUser_());
    }

    /// <summary>
    /// Appeller mon IEnumerator ClosePopUp_() de ma class.
    /// </summary>  
    private void ClosePopUp()
    {
        StartCoroutine(ClosePopUp_());
    }

    /// <summary>
    /// Jouer un son avant le system de connexion ainsi que gérer le system de connexion.
    /// </summary>
    /// <returns>Crée un timer entre le son jouer et le system de Connexion</returns>
    IEnumerator ConnexionUser_()
    {
        BouttonSound btnSoundClick = new BouttonSound(soundClick);
        btnSoundClick.Play();

        yield return new WaitForSeconds(waitSeconde);

        if (adresseMail.placeholder.isActiveAndEnabled)
        {
            this.OpenPopUp(message.Texte_Empty_Mail);
        }
        else if (password.placeholder.isActiveAndEnabled)
        {
            this.OpenPopUp(message.Texte_Empty_Password);
        }
        else if (!adresseMail.placeholder.isActiveAndEnabled && !password.placeholder.isActiveAndEnabled)
        {
            ConnectMinecraft();
        }

        accept.onClick.RemoveAllListeners();
        accept.onClick.AddListener(ClosePopUp);

        close.onClick.RemoveAllListeners();
        close.onClick.AddListener(ClosePopUp);
    }

    /// <summary>
    /// Jouer un son avant la fermeture de la Pop-Up ainsi que fermer la Pop-Up. {Utilise l'api [BouttonSound.class]}
    /// </summary>
    /// <returns>Crée un timer entre le son jouer et le system de fermer la Pop-Up</returns>
    IEnumerator ClosePopUp_()
    {
        BouttonSound btnSoundClick = new BouttonSound(soundClick);
        btnSoundClick.Play();

        yield return new WaitForSeconds(waitSeconde);

        panelPop.SetActive(false);
    }

    /// <summary>
    /// Ouvrire la fenêtre Pop-Up avec un message custom. {Utilise l'api [PopUp.class]}
    /// </summary>
    /// <param name="message_">Message qui sera afficher dans ma PopUp</param>
    private void OpenPopUp(string message_)
    {
        PopUp popUp = new PopUp(message_, panelPop);
        popUp.Build();
    }

    /// <summary>
    /// Tester si l'adresse email ainsi que le mot de passe sont des identifiants valides de Mojang ensuite si ils sont corrects les Enregistrés dans un json sinon j'ouvre une Pop-Up avec un message customiser. {utilise l'api [ConnectMinecraft.class] et [JsonCRUDS.class]}
    /// </summary>
    private void ConnectMinecraft()
    {
        try
        {
            ConnectMinecraft cm = new ConnectMinecraft(adresseMail.text, password.text);

            string token = cm.Access_Token1;
            JsonData data = JsonMapper.ToObject(token);

            InformationPlayer.username = data["selectedProfile"]["name"].ToString();
            InformationPlayer.uuid = data["selectedProfile"]["id"].ToString();

            //textTest.text = data["selectedProfile"]["name"].ToString() + data["selectedProfile"]["id"].ToString();

            UtilisateurJson utilisateurJson = new UtilisateurJson(InformationPlayer.username,InformationPlayer.uuid);
            jsonCRUDS.writeFile(Application.streamingAssetsPath + "/Utilisateur.json", utilisateurJson);

            ok = true;
            //scriptProgressBar.SetActive(true);
        }
        catch (WebException e)
        {
            this.OpenPopUp(message.Texte_Error_Mail_Password);
        }
    }
}

public class UtilisateurJson
{
    public string username;
    public string uuid;

    public UtilisateurJson(string username_, string uuid_)
    {
        this.username = username_;
        this.uuid = uuid_;
    }
}
Ma fonction Reset n'est pas correcte n'ont plus, j'attend de voir comment écrire dans un fichier pour faire la fonction reset sinon ma fonction read fonctionne correctement.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6187
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: C# Write Json sur android

Message par boubouk50 » 14 Fév 2019 11:06

Sans lire ton code, ne serait-ce pas un pb de droit d'accès ou de modification? Ou bien de chemin d'accès?
Où se situe ton fichier? Dans StreamingAssets?

https://docs.unity3d.com/Manual/StreamingAssets.html
On Android, use:
path = "jar:file://" + Application.dataPath + "!/assets/";
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: C# Write Json sur android

Message par maliimaloo » 14 Fév 2019 14:13

Salut, avec ce bout de code j'obtiens une erreur:

Code : Tout sélectionner

Could not find a part of the path "/jar:file:/data/app/fr.maliimaloo.Ellisys-6QNbs-M7qpO1LQKSB_zkjQ==/base.apk!/assets"

Code : Tout sélectionner

        try
        {
            foreach (string fileName in Directory.GetFiles("jar:file://" + Application.dataPath + "!/assets/"))
            {
                textTest.text += fileName + ", ";
            }
        }
        catch (IOException e)
        {
            textTest.text = e.Message;
        }

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6187
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: C# Write Json sur android

Message par boubouk50 » 14 Fév 2019 15:02

Je ne pense pas que tu puisses accéder comme cela au dossier. Le fichier .jar est un dossier compressé, il faut surement aller directement au fichier.
Quelques réponses sur le forum officiel:
https://answers.unity.com/questions/210 ... ccess.html
https://forum.unity.com/threads/unity-3 ... es.114660/
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: C# Write Json sur android

Message par maliimaloo » 14 Fév 2019 16:13

Salut,;

La première c'est-ce que j'utilise pour Lire mon Json, mais je pense pas qu'avec une unitywebrequest je peux modifier un Json.

La seconde n'est pas bonne car elle permet aussi de lire le json et écrire dans le Json à partir d'un fichier déjà rempli, mais moi ce qui m'intéresse c'est de le remplir à partir d'un jsonMapper.ToJson(objet).ToString().

Je crois avoir résolu, une partie du problème, donc quand je déploie en .apk, ensuite l'apk je le mets dans "Stockage interne" et du coup l'utilisateur.json", s'enregistre dans "/StockageInterne/Android/Data/fr.maliimaloo.Ellisys/files/Utilisateur.json"

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: C# Write Json sur android

Message par maliimaloo » 14 Fév 2019 17:17

Le problème c'est que tout le monde y a accès, auriez-vous une solution ?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6187
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: C# Write Json sur android

Message par boubouk50 » 14 Fév 2019 17:32

La solution, c'est d'externaliser (serveur) si tu veux tout contrôler.
Sinon, encrypter.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

maliimaloo
Messages : 45
Inscription : 28 Sep 2017 19:06

Re: C# Write Json sur android

Message par maliimaloo » 14 Fév 2019 17:42

Très bien, je vais essayer la première solution donc encrypter, ensuite si je trouve des fails, je créerais le fichier sur un VPS ^^

Merci de ton aide énormément ^^

Répondre

Revenir vers « Développement plateformes mobile Iphone et Android »