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.
-
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.
Tags:
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...
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 :
Et tu seras s’il y a bien le répertoire "assets".Code (Text):Info(fListeRépertoire(fRepExe(), frNonRécursif))
A+.
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.
Je ne travaille pas sur IOS, donc je ne connaissais pas "fRepRessource",
par contre j’utilise beaucoup "fRepEnCours" sur Android.
A+.
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.
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+
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.
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 :
Mais impossible de lister le contenu avec "fListeFichier", j’ai l’impression qu’on n’a pas les droits,Code (Text):fRepDonnées() + ["/"] + "polices"
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+.
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?
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 :
Et pour être compatible avec les méthodes de la LST 91, il faut extraire les polices dans le même répertoire.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
}
}
}
}
Un petit exemple de fonctionnement :
On ne peut toujours pas lister les fichiers extraits, mais on peut vérifier leurs existences.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
A+.
popoy apprécie ceci.
salut a tous,
MerciBonjour 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
Les modifications sont le rajoutCode (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);
}
}
}
import android.content.res.AssetManager;
et
l'utilisation de la fonction Typeface.createFromAsset à la place de Typeface.createFromFile
FreudWD apprécie ceci.
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+.
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
Voici la traduction d'une partie intéressante de la pageCode (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.
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.
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+.
MerciBonjour 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)
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+.