1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.
  2. Bonjour tout le monde ! Veillez consulter la Politique de forum pour comprendre nos règles, Merci a vous !
    Rejeter la notice

AIDE Récuperer le chemin du Dossier ASSETS sur ANDROID

Discussion dans 'Windev Mobile' créé par popoy, Oct 18, 2020.

  1. popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533
    Bonjour a tous
    je cherche a trouver comment on récupère le chemin du dossier asset
    En effet lorsque l'on intègre des polices de caractères dans windev mobile
    pcsoft les mets dans le dossier asset

    JJ'arrive a lister les fichiers du dossier asset mais ma fonction ne fournit pas le chemin
    Code (Text):
    //Procedure Globale Java ListeFichiersAssets
    import java.io.IOException;
    import android.content.res.AssetManager;

    public static String ListeFichiersAssets()
    {
    AssetManager assetManager = getContexteApplication().getAssets();
    String txtFileName = "";

    // To get names of all files inside the "Assets" folder
    try {
    String[] files = assetManager.list("");
    for(int i=0; i<files.length; i++)
    {
    txtFileName = txtFileName + files[i] + "\n";
    }
    } catch (IOException e1) {
    // Auto-generated catch block
    e1.printStackTrace();
    }
    return txtFileName;
    }
    // Résumé : Renvoie la Liste des Fichiers inclus dans le répertoire Assets
    Merci de votre aide
     
  2. Wikeos

    Wikeos Active Member

    Inscrit:
    Fev 27, 2020
    Messages:
    167
    J'aime reçus:
    165

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour a tous
    je cherche a trouver comment on récupère le chemin du dossier asset
    En effet lorsque l'on intègre des polices de caractères dans windev mobile
    pcsoft les mets dans le dossier asset

    JJ'arrive a lister les fichiers du dossier asset mais ma fonction ne fournit pas le chemin
    Code (Text):
    //Procedure Globale Java ListeFichiersAssets
    import java.io.IOException;
    import android.content.res.AssetManager;

    public static String ListeFichiersAssets()
    {
    AssetManager assetManager = getContexteApplication().getAssets();
    String txtFileName = "";

    // To get names of all files inside the "Assets" folder
    try {
    String[] files = assetManager.list("");
    for(int i=0; i<files.length; i++)
    {
    txtFileName = txtFileName + files[i] + "\n";
    }
    } catch (IOException e1) {
    // Auto-generated catch block
    e1.printStackTrace();
    }
    return txtFileName;
    }
    // Résumé : Renvoie la Liste des Fichiers inclus dans le répertoire Assets
    Merci de votre aide
    Cliquez pour agrandir...
    Hello popoy,

    Je ne sais pas si cela va t'aider mais je tente, ça à l'air de ressembler à ce que tu souhaites

    [​IMG]
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    , merci mais là tu parles de la création de l'apk où on peut indiquer l'emplacement des fichiers.
    Moi je cherche par programmation ce chemin.
    La ligne
    AssetManager assetManager = getContexteApplication().getAssets();

    Permet d'y accéder mais pas d'indiquer son chemin.
    L'extraction ne m'intéresse pas non plus.
     
  • Wikeos

    Wikeos Active Member

    Inscrit:
    Fev 27, 2020
    Messages:
    167
    J'aime reçus:
    165

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    , merci mais là tu parles de la création de l'apk où on peut indiquer l'emplacement des fichiers.
    Moi je cherche par programmation ce chemin.
    La ligne
    AssetManager assetManager = getContexteApplication().getAssets();

    Permet d'y accéder mais pas d'indiquer son chemin.
    L'extraction ne m'intéresse pas non plus.
    Cliquez pour agrandir...
    Ah mince, désolé l'ami je vois pas du tout alors
     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!



    Les ressources sont décompressées à la racine du répertoire de travail.

    Tu as son emplacement avec la fonction "fRepExe()", il te reste à ajouter le répertoire de la ressource.
    Par exemple, avec une gestion de base de données dans ton apk, il y aura les répertoires "databases" et "lib".

    Tu peux lister les répertoires dans ton appli mobile avec ceci :
    Code (Text):
    Info(fListeRépertoire(fRepExe(), frNonRécursif))
    Et tu seras s’il y a bien le répertoire "assets".

    A+.
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    bonne idée
    Celle ci fonctionne bien sous iOS.
    Car les polices de caractères sont placés dans fRepRessource par pcsoft sur iOS.
    Cependant le dossier asset est particulier sous Android et sans extractions je doute que cela fonctionne.
    Je vais quand même vérifier, on ne sait jamais.
     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    Je ne travaille pas sur IOS, donc je ne connaissais pas "fRepRessource",
    par contre j’utilise beaucoup "fRepEnCours" sur Android.

    A+.
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533
    Bon après vérification
    fRepDonnées
    fRepEnCours
    fRepExe
    fRepCache
    Ne renvoie rien
    C'est bizarre car même
    fListeRessource
    Ne renvoie rien
    Seul
    SysRepCarteStockage renvoie la liste des fichiers présent sur la mémoire interne du smartphone
    Pourtant j'ai mis des fichiers puisque des polices de caractères sont bien présentes dans l'apk.
    Je cherche.
     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    Alors, le répertoire "assets" est-il présent ?

    Si oui, c’est que tu n’as pas les droits de lecture sur ce répertoire,
    il faudrait changer les droits de cette ressource à la génération de l’apk,
    ou d’utiliser "fExtraitRessource" en fonction de comment tu l'as ajouté.

    Comment ajoutes-tu les polices dans l’apk ?

    A+
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533
    Comme je l'ai écrit au début j'arrive à lister les polices du dossier asset grâce à mon code Java et je suis sur qu'elle sont dans le dossier asset
    J'arrive d'ailleurs à les affectée à un champ HTML ( voir mon tutoriel dans les ressources de ce forum)
    Ici ce que je souhaite c'est d'affecter les polices par programmation à un champ de saisie.
    Mais je m'inspire de la lst 91 police personnaliser.
    J'ai 3 soucis
    1 depuis cette LST pcsoft met les fichiers dans le dossier asset
    (Au niveau du projet - avancée - polices du projet)
    2 je ne souhaite pas les mettre une deuxième fois dans l'apk ( ressources) car elles sont déjà présente.
    3 fExtraitRessource ne peut fonctionner car fListeRessource ne renvoie rien et ne sert à rien puisque j'arrive à y accéder dans un champ HTML.
    Bizarrement je n'arrive pas à y accéder en dehors.
    Si pcsoft y arrive pourquoi je n'y arrives pas et les variables police et les fonctions qui vont avec existe en iOS mais pas en Android.
     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    Je viens d’installer le projet de la LST 91, et dans l’apk de l’exemple, il n’y a pas de répertoire "assets",
    par contre, je vois bien les 4 polices dans les ressources, plus précisément dans raw.

    Et quand je lis le PDF de la LST, ils disent d’utiliser "fExtraitRessource",
    ce qui veux dire que les polices ne sont pas dans le projet,
    mais dans la fenêtre "Intégration de fichiers" à la création de l’apk,
    et seulement dans ce cas, la fonction "fListeRessource" marchera.

    J’ai fait plusieurs tests avec la police dans le projet, il y a bien un répertoire "assets" dans l’apk,
    mais aucun nouveau répertoires à l’installation, donc elle n’est pas extraite.

    Avec la police dans les ressources, un répertoires "databases" est créé avec à l’intérieur "polices".
    On peut avoir le répertoires en utilisant ceci :
    Code (Text):
    fRepDonnées() + ["/"] + "polices"
    Mais impossible de lister le contenu avec "fListeFichier", j’ai l’impression qu’on n’a pas les droits,
    il faut donc utiliser "fListeRessource" pour avoir la liste des fichiers.

    Pourquoi as-tu mis les polices dans "Polices du projet" ? Y-a-t-il une raison ?
    (En dehors de la distribution des polices dans l’apk)

    A+.
     
    #11 FreudWD, Oct 23, 2020
    Dernière édition: Oct 23, 2020
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533
    Tout ce que tu dis est vrai
    La raison est que le projet est Android et iOS.
    Que sur iOS j'accède aux polices.
    Je cherche juste à convertir mon projet sur Android.
    Si je ne trouve pas de solution
    Je finirai par utiliser fExtraitRessource
    Mais c'est con de devoir mettre 2 fois les polices dans l'apk, non?
     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    Bon, t’as gagné, je vais regarder ton code java et compléter. ;)

    Il faut refaire l’extraction des ressources, mais en partant des assets :
    Code (Text):
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.FileOutputStream;
    import android.content.res.AssetManager;

    public static void ExtraitFichierAssets(String sNomFichier, String sChemin) {
        int read;
        InputStream in = null;
        OutputStream out = null;
        AssetManager assetManager = getContexteApplication().getAssets();
        byte[] buffer = new byte[1024];

        try {
            in = assetManager.open(sNomFichier);
            out = new FileOutputStream(sChemin + sNomFichier);
           
            while((read = in.read(buffer)) != -1) {
                out.write(buffer, 0, read);
            }
        } catch(IOException e) {
            Log.e("tag", "Failed to copy asset file: " + sNomFichier, e);
        }    
        finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    // NOOP
                }
            }
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    // NOOP
                }
            }
        }
    }
    Et pour être compatible avec les méthodes de la LST 91, il faut extraire les polices dans le même répertoire.
    Un petit exemple de fonctionnement :
    Code (Text):
    sListe est une chaîne = ListeFichiersAssets()

    POUR TOUTE CHAÎNE sFichier DE sListe SEPAREE PAR Caract(10)
        SI Droite(sFichier, 4) = ".ttf" ALORS
            ExtraitFichierAssets(sFichier, fRepPolices())

            // Vérification
            SI fFichierExiste(fRepPolices() + sFichier) ALORS
                Info("le fichier " + sFichier + " existe !")
            SINON
                Info("le fichier " + sFichier + " n'existe pas !")
            FIN
        FIN
    FIN
    On ne peut toujours pas lister les fichiers extraits, mais on peut vérifier leurs existences.

    A+.
     
    popoy apprécie ceci.
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533
    salut a tous,
    Merci

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    pour ton code d'extraction des fichiers du dossier assets.
    Bon je n'ai toujours pas trouver le chemin du dossier asset.
    Cependant j'ai reussi à modifier le code de la LST 91 pour eviter l'extraction
    Voici le code de modification de la fenêtre
    Code (Text):
    import android.app.Activity;
    import android.widget.TextView;
    import android.view.*;
    import android.graphics.Typeface;
    import android.util.*;
    import java.lang.Exception;
    import java.io.IOException;
    import android.content.res.AssetManager;

    // Change la police sur toute la fenêtre
    //
    // Paramètres :
    //     sPolice : La police à appliquer
    //
    public static boolean FenêtreModifiePoliceDepuisAssets(String sPolice)
    {
        // Variables locale
        Activity activiteEnCours;
        Window fenetreEnCours;
        //String sCheminPolice;
        Typeface policeAAppliquer;
        // Récupération du dossier Asset
        AssetManager assetManager = getContexteApplication().getAssets();
       
        try{
            // Récupération de l'activité
            activiteEnCours = getActiviteEnCours();
           
            if (activiteEnCours != null){
                // récupération de la fenêtre
                fenetreEnCours = activiteEnCours.getWindow();
               
                if(fenetreEnCours!= null){
                    // Récupération du decorview
                    View decor = fenetreEnCours.getDecorView();
                   
                    if((decor != null) && (decor instanceof ViewGroup)){
               
                        // Récupération de la police  
                        policeAAppliquer = Typeface.createFromAsset(assetManager, sPolice);
                       
                        if (policeAAppliquer != null){
                            // Application de la police à tous les libellés de la fenêtre
                            FenêtreModifiePoliceFils((ViewGroup) decor,policeAAppliquer);
                            return true;
                        }
                        else{
                            Log.e("WM","Police introuvable");
                            return false;
                        }
                    }
                    else{
                        return false;
                    }
                }
                else{
                    return false;
                }
            }
            else{
                return false;
            }
        }
        catch(Exception e) {
            Log.e("WM","Erreur lors de l'application de la police sur la fenêtre. " + e.toString());
            return false;
        }
    }

    // Parcours des fils
    public static void FenêtreModifiePoliceFils(ViewGroup parent, Typeface police){
       
        // Application de la police à tous les fils
        for (int i = 0; i < parent.getChildCount(); i++) {        
            View v = parent.getChildAt(i);        
            if (v instanceof TextView) {
                ((TextView) v).setTypeface(police);
            }
            else if(v instanceof ViewGroup){
                // On rentre encore plus bas
                FenêtreModifiePoliceFils(((ViewGroup) v),police);
            }
        }
    }
    Les modifications sont le rajout
    import android.content.res.AssetManager;
    et
    l'utilisation de la fonction Typeface.createFromAsset à la place de Typeface.createFromFile
     
    FreudWD apprécie ceci.
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    Bravo, c’est beaucoup mieux.

    J’essayais de comprendre le pourquoi d’un fichier temporaire dans le cache,
    au moment de la lecture des assets, il disparait trop vide et change à chaque fois.

    Je me demande si PCSoft n’a pas choisi la version fichier pour éviter d’extraire la police à chaque
    affichage de fenêtre et de le faire qu’au démarrage (alors que le premier démarrage suffirait).

    Ce que je n’ai pas réussi à savoir, c’est si la lecture des assets se fait qu’en mémoire (même s’il y a une compression à gérer).

    A+.
     
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533
    D'après ce que j'ai compris
    Le dossier asset fait partie raw des ressources
    Et on y accède pas comme l'on veut
    Il y une page qui en parle

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!


    Ce que je ne comprends pas c'est que pcsoft aurait pu les mettre dans la partie font des ressources. Surtout que l'aide dit qu'ils mettent dans le dossier font
    Voir page

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!


    Où il écrit
    Code (Text):
    Pour utiliser des polices spécifiques (en édition comme en exécution) :
    Affichez la fenêtre de description du projet : sous le volet "Projet", dans le groupe "Projet", cliquez sur "Description".
    Dans l'onglet "Avancé", cliquez sur le bouton "Polices du projet".
    Dans la fenêtre qui s'affiche, ajoutez les polices voulues (bouton "Ajouter" permettant d'ajouter des fichiers au format "TTF" ou "OTF"). Les fichiers correspondant à la police seront copiés dans le sous-répertoire "Fonts" du projet.
    Voici la traduction d'une partie intéressante de la page
    Enfin bon, cela veut surement dire qu'il n'y aura jamais de chemin pour ce dossier.
    Je pense qu'il faut garder les fonctions d'extraction et d'utilisation des polices.
    Cela peut servir car pcsoft n'a fourni aucune fonction de gestion de police pour Android.
     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    Je viens de faire un tour sur ma tablette routée, et dans notre cas avec les polices,
    le contenu des assets n’est jamais extrait automatiquement dans un quelconque répertoire,
    que ce soit au moment de l’installation ou après les exécutions (WM20 ou WM24).

    Je parle des polices dans sa version nommée avec l’extension .ttf (une recherche globale sur "/"),
    il n’y a qu’une version de l’apk en .odex (décompressé et optimisé pour le périphérique),
    rien d’autres sur les répertoires propres à l’application : /data/data et /data/app.

    Cela confirme que le dossier des assets correspond à l’accès au contenu du fichier l’odex,
    avec cette version décompressée, plus besoin de fichier temporaire, la lecture est direct.

    En dehors d’un fichier volumineux, l’avantage de la lecture du fichier .odex,
    c’est qu’en une seule fois on lit toutes les polices de l’assets en mémoire.

    Oui, j’ai vu dans WM20 et +, le répertoire "Fonts", j’ai beau créer le répertoire avec les droits 777,
    au cas où il y aurait un problème là-dessus, dans les répertoires racine, files et database,
    rien ni fait, aucune décompression automatique des assets.
    J’ai l’impression que le dossier "Fonts" ne concerne que le répertoire du projet sous Windows.

    A+.
     
    #17 FreudWD, Oct 26, 2020
    Dernière édition: Oct 26, 2020
  • popoy

    popoy Well-Known Member
    MEMBRE WX

    Inscrit:
    Fev 23, 2018
    Messages:
    2,884
    J'aime reçus:
    1,533
    Merci

    Bonjour visiteur, Merci de vous Inscrire ou de vous connectez pour voir les liens!

    de cette information.
    Cela prouve qu'il ne faut pas croire tout ce qui est écrit dans l'aide.
    J'ai aussi un appareil root mais je ne l'utilise que peu souvent et j'avais pas penser à l'utiliser dans ce cas.
    Il est donc confirmée qu'il n'y a pas de chemin puisque le dossier reste à l'intérieur de l'application.
    A vérifier si il est aussi accessibles en écriture et dans ce cas il serait intéressant de pouvoir sécurisé l'application en y intégrant une info concernant l'appareil ce qui empêcherait la copie de l'apk sur un autre appareil.
    (Es explorateurs de fichiers peut copier les apk)
     
  • FreudWD

    FreudWD Well-Known Member
    MEMBRE WX WXG 21

    Inscrit:
    Jan 22, 2018
    Messages:
    199
    J'aime reçus:
    368
    C’est pire que ce je pensais, de mémoire, les fichier .dex sont des binaire JIT,
    puis depuis la version 5.0 les binaire JIT sont compilés à l’installation, ce qui donne les fichiers .odex.

    Donc, le fichier .odex n’est que l’application Android compilée, ce qui veut dire que les ressources et les assets sont encore dans le fichier .apk.
    Je comprends mieux l’utilisation de "LruCache" par les développeur Android pour mettre en cache les polices,
    quelle perte de temps et de ressources pour les extraire à chaque fois.

    Pour l’extraction des apk, on les récupère bien comme ça, l’accès en lecture suffit.

    A+.
     
  • Partager cette page

    Chargement...