web-dev-qa-db-fra.com

"Les polices de caractères autochtones ne peuvent pas être créées" seulement pour certaines personnes

J'ai une application qui modifie la police de caractères de certains éléments. Cela fonctionne bien pour la plupart des gens, mais peut-être que 0,5% font exception à la règle en essayant de changer la police. La partie importante de la trace de la pile est la suivante:

Caused by: Java.lang.RuntimeException: native typeface cannot be made
at Android.graphics.Typeface.<init>(Typeface.Java:147)
at Android.graphics.Typeface.createFromAsset(Typeface.Java:121)

Comme je le dis, cela fonctionne pour la plupart des gens, donc je ne pense pas que ce soit un problème avec le fichier de police ou mon code. Des suggestions sur la façon de résoudre ce problème?

Edit: Ceci est mon code:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                                 "fonts/CharisSILR.ttf");
TextView tv;
tv = ((TextView) findViewById(R.id.searchPronunciationTitle));
tv.setTypeface(phoneticFont);
74
user936580

Ce bogue de l'OS Android pourrait être la raison de votre problème:

Typeface.createFromAsset perd un flux d'actifs

Où sont également une solution de contournement dans ce rapport de bogue:

J'ai modifié la solution de contournement de HTH afin que la méthode n'assume pas la police chemin ou format. Le chemin complet de la ressource de police doit être soumis au format un paramètre. J'ai également encapsulé l'appel à createFromAsset () dans un fichier bloc try-catch pour que la méthode get () renvoie la valeur null si l'actif n'est pas trouvé.

public class Typefaces {
    private static final String TAG = "Typefaces";

    private static final Hashtable<String, Typeface> cache = new Hashtable<String, Typeface>();

    public static Typeface get(Context c, String assetPath) {
        synchronized (cache) {
            if (!cache.containsKey(assetPath)) {
                try {
                    Typeface t = Typeface.createFromAsset(c.getAssets(),
                            assetPath);
                    cache.put(assetPath, t);
                } catch (Exception e) {
                    Log.e(TAG, "Could not get typeface '" + assetPath
                            + "' because " + e.getMessage());
                    return null;
                }
            }
            return cache.get(assetPath);
        }
    }
}
68
HitOdessit

J'ai suivi certaines des solutions trouvées ici, sans succès. Je pensais que c'était quelque chose de très obscur, comme le font souvent les programmeurs. Puis quelque part, j'ai lu que cela pourrait être lié au chemin de la police, gotcha:

Au lieu de:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "blanch_caps.ttf");   

J'ai changé pour:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/blanch_caps.ttf");   

Et mon fichier est dans assets/fonts/blanch_caps.ttf. Non cela fonctionne comme un charme!

52
joao_dv

Cette erreur s'est produite lorsque la police se trouvait dans le dossier des ressources de la bibliothèque. Lorsque je l'ai copié dans les actifs de l'application qui utilisait cette bibliothèque, l'erreur a disparu.

Il semble que les ressources ne puissent pas être importées: Le dossier des ressources de la bibliothèque Android n'est pas copié

Et voici quelques autres cas: Problème lors de l'utilisation d'une police personnalisée - "les polices de caractères natives ne peuvent pas être créées"

50
Lumis

Je me débattais beaucoup avec ça. J'ai essayé toutes les possibilités et rien n'y fait. En fin de compte, le problème était ailleurs. Si vous construisez votre projet avec Gradle, n'oubliez pas d'ajouter ces lignes dans le fichier build.gradle. Cela a résolu le problème dans mon cas.

    sourceSets {
    main {
        assets.srcDirs = ['assets']
    }
}
25
Michal

Vous devez créer un dossier d'actifs dans src -> main dans Android Studio. Cette façon a fonctionné!

7
Madi

Pour mon cas, j'ai trouvé que le dossier assets situé dans /main/Java/assets mais ils doivent l'être dans /main/assets

4
Chulo

Dans mon cas, il était basé sur le nom de fichier de la police. Pour une raison quelconque, il a été nommé FontName..ttf

Je ne sais pas pourquoi les doubles points étaient là - j'ai recherché la police d'origine et ils se trouvaient dans mon dossier windows\fonts en tant que FontName..ttf. Windows ne s'en souciait apparemment pas, mais Android a paniqué. J'ai renommé le fichier et tout est heureux maintenant.

4
Tab

Faire avec minuscule:

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/charissilr.ttf");

N'oubliez pas de renommer également le fichier.

2
Pedro HCDO

Changer celui-ci

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "fonts/CharisSILR.ttf");

à

Typeface phoneticFont = Typeface.createFromAsset(getAssets(),
                                             "CharisSILR.ttf");
1
Kadir altınok

Dans notre cas, nous avions utilisé la solution de Hit avec le cache. Le problème que nous avons présenté est que nous testions des fichiers OTF ET des fichiers TTF dans le même bloc try;) Ce qui va évidemment échouer à la première tentative pour OTF si vous souhaitez obtenir un TTF, mais je pensais que cela valait la peine de le publier. JUST au cas où il aurait glissé dépassé l'avis de quelqu'un alors qu'ils pourraient essayer la même solution.

protected static Typeface getTypeface(Context p_context, String p_fontName){
    Typeface tf = null;
    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".otf");
    }catch(Exception e) {}

    if( tf != null ) return tf;

    try {
        tf = Typeface.createFromAsset(p_context.getAssets(), "fonts/" + p_fontName + ".ttf");
    }catch(Exception e) {}

    return tf;
}
0
neoRiley

Dans mon cas, je viens de supprimer le dossier des actifs (que j'ai créé manuellement) et d'en créer un nouveau à l'aide de l'assistant. Apparemment, il n'a pas été lu comme un dossier d'actifs, mais comme un dossier normal. Ainsi, getAssets () n'a pas fonctionné et m'a donné l'erreur.

0
omarwaleed

Dans mon cas,

Je viens d'utiliser le code précédent .. Donc, j'oublie le fichier de police dans le dossier des actifs ..

Mais je ne peux pas comprendre pendant 2 heures .. 

Cas possibles pour cette erreur,

  1. Fichier de police manquant
  2. Nom de police incorrect ou mauvaise extension de police

par exemple: fonts/roboto.ttf au lieu de fonts/roboto.otf

0
Ranjith Kumar

Ce problème a été couru lorsque j'ai importé un module destiné à prendre en charge les projets de style Eclipse et les projets de style studio Android.

J'ai résolu mon problème en supprimant les actifs de l'ensemble des sources comme-

defaultConfig {
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName '1.0'

        sourceSets {
            main {
                Java.srcDirs = ['src']
                res.srcDirs = ['res']
                //assets.srcDirs = ['assets']//commented this out because modlue was not having this directory
                manifest.srcFile 'AndroidManifest.xml'
            }
        }
    }

Convertir le projet en style studio Android peut également résoudre le problème, je suppose.

0
Sanjeet A

dans Android studio: ce qui a fonctionné pour moi, c’est de placer le fichier ttf directement dans le dossier assets sans sous-dossier de polices, cela ne fonctionnait pas avec le sous-dossier J'ai eu le ttf dans src/main/assets/polices) . Cela fonctionne: src/main/assets/oldengl.ttf. ");

0
Stas Krantsov

Je viens de rencontrer ce problème lorsque j'utilisais MagicTextView de qwerjk. J'ai essayé de mettre la classe MTV dans une bibliothèque et de l'utiliser dans mon projet principal. Voici comment je l'ai eu pour fonctionner:

  1. Dans le dossier des ressources principales du projet, créez un sous-dossier appelé polices.
  2. Copiez le fichier ttf dans le dossier assets/fonts. Mon nom de fichier était camelcase (par exemple, ReservoirGrunge.ttf). Ainsi, les majuscules ou pas de majuscules ne semblent pas avoir d’importance.
  3. Dans mon projet principal, j'ai gonflé la vue MTV à partir de XML. Assurez-vous que MagicTextView pointe vers le chemin de bibliothèque correct. Par exemple, ma bibliothèque de classes MTV était com.library.library_magictextview.MagicTextView et le xml de ma vue principale devait donc être lu:

        <com.library.library_magictextview.MagicTextView
        Android:textSize=           "50dp"
        Android:textColor=          "#ffffffff"
        Android:layout_width=       "fill_parent"
        Android:layout_height=      "wrap_content"
    
        Android:textStyle=          "bold"
        Android:padding=            "20dp"
        Android:gravity=            "center"
    
        r:strokeColor=          "#FFff0000"
        r:strokeJoinStyle=      "miter"
        r:strokeWidth=          "5"
        r:typeface=         "ReservoirGrunge"
        Android:text=               "BobDillon" />
    
0
Chris Sprague