2017-10-23 5 views
-1

Ich möchte eine App, die Systemschriftart in Galaxy Handy ändern können, nach der Installation meiner App Benutzer können Schriftart von Einstellung> mein Gerät> Schriftart ändern und wählen Sie aus der Liste ohne root Erlaubnis. Ich habe meinen eigenen Schriftstil in TrueType-Datei. Klicken Sie auf here, um ein Beispiel für eine App zu sehen, die ich erstellen möchte.FlipFont App für Galaxy Handys

Down Voting wird nicht helfen Bitte beantworten oder nicht abstimmen.

enter image description here

enter image description here

enter image description here

manidest

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="2" android:versionName="1.1" package="com.monotype.android.font.presentltroman" platformBuildVersionCode="23" platformBuildVersionName="6.0-2438415"> 
    <uses-sdk android:minSdkVersion="7" /> 
    <application android:label="@string/app_name" android:icon="@drawable/icon"> 
     <provider android:name=".FontContentProvider" android:authorities="com.example.myfont" /> 
     <support-screens android:largeScreens="true" android:xlargeScreens="true" /> 
    </application> 
</manifest> 

Es gibt nur eine Aktivität

import android.content.ContentProvider; 
import android.content.ContentValues; 
import android.content.UriMatcher; 
import android.content.res.AssetFileDescriptor; 
import android.content.res.AssetManager; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.ParcelFileDescriptor; 
import android.util.Log; 
import java.io.FileNotFoundException; 

public class FontContentProvider extends ContentProvider { 
    private static final UriMatcher uriMatcher = new UriMatcher(-1); 

    public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
     return null; 
    } 

    public AssetFileDescriptor openAssetFile(Uri uri, String mode) throws FileNotFoundException { 
     String file_name = uri.getPath(); 
     if (file_name == null) { 
      throw new FileNotFoundException(); 
     } 
     if (file_name.startsWith("/")) { 
      file_name = file_name.substring(1); 
     } 
     AssetFileDescriptor ad = null; 
     try { 
      ad = getContext().getAssets().openFd(file_name); 
     } catch (Exception e) { 
      Log.v("CPFontTest", "cp - openAssetFile EXCEPTION"); 
     } 
     return ad; 
    } 

    public int delete(Uri uri, String selection, String[] selectionArgs) { 
     return 0; 
    } 

    public String getType(Uri uri) { 
     AssetManager am = getContext().getAssets(); 
     StringBuilder xmlfileStringBuilder = new StringBuilder(); 
     try { 
      for (String s : am.list("xml")) { 
       xmlfileStringBuilder.append(s + "\n"); 
      } 
      return xmlfileStringBuilder.toString(); 
     } catch (Exception e) { 
      return null; 
     } 
    } 

    public Uri insert(Uri uri, ContentValues values) { 
     return null; 
    } 

    public boolean onCreate() { 
     return true; 
    } 

    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { 
     return null; 
    } 

    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { 
     return 0; 
    } 

    static { 
     uriMatcher.addURI(".fontcontentprovider", "fonts", 1); 
    } 
} 
+0

Was ist Ihre Frage? –

+0

wie man flipfont app mit android studio machen –

Antwort

2

TL; DR: eine FlipFont Sie eine gültige Schriftartdatei und XML-Datei in Assets erstellen müssen. Die APK muss mit dem privaten Keystore von Monotype signiert werden, was nicht möglich ist.


Samsung und anderen Herstellern verwenden Monotype FlipFont Systemschriften ohne root zu ändern. Samsung und Monotype Imaging Inc. möchten, dass Sie für die Änderung der Schriftarten zahlen, und haben gemeinsame Anstrengungen unternommen, um die Installation von kostenlosen Schriftarten zu verhindern.

Sie benötigen keinen Code, um eine Schriftart für FlipFont zu erstellen, so dass Sie FontContentProvider.java löschen können.

Um eine APK zu erstellen, die Sie mit FlipFont funktioniert müssen die folgenden drei Dinge:

1) Eine gültige Schriftartdatei in assets/fonts/ReplaceWithFontName.ttf

2) Ein XML in assets/xml/ReplaceWithFontName.xml

3) Erstellen und signieren Sie die App mit dem privaten Schlüsselspeicher von Monotype.

Beispiel XML für Vermögenswerte:

<?xml version="1.0" encoding="utf-8"?> 
<font displayname="ReplaceWithFontName"> 
    <sans> 
    <file> 
     <filename>ReplaceWithFontName.ttf</filename> 
     <droidname>DroidSans.ttf</droidname> 
    </file> 
    <file> 
     <filename>ReplaceWithFontName.ttf</filename> 
     <droidname>DroidSans-Bold.ttf</droidname> 
    </file> 
    </sans> 
</font> 

Nun schauen # 3 wieder. Sie müssen die APK mit dem Keystore von Monotype unterschreiben. Sie haben keinen Zugriff darauf. Daher funktioniert Ihr APK nicht auf Samsung-Geräten.

Die folgende Methode wird von der Anwendung Einstellungen auf einem Samsung-Gerät dekompilierten und wird verwendet, wenn die FlipFont APK mit dem richtigen Schlüssel signiert ist zu überprüfen:

protected boolean checkFont(String apkname) { 
    if (DEBUG) { 
    Log.secD("FlipFont", "checkFont - checking apkname" + apkname); 
    } 
    if ("com.monotype.android.font.foundation".equals(apkname)) { 
    return false; 
    } 
    PackageManager pm = this.mContext.getPackageManager(); 
    for (int i = 0; i < apkNameList.length; i++) { 
    if (apkname != null) { 
     if (apkname.equals(apkNameList[i])) { 
     this.isCheckPlatformSignatures = pm.checkSignatures("android", apkNameList[i]) == 0; 
     this.isCheckReleaseSignatures = Utils.isSignatureMatch(this.mContext, apkNameList[i]); 
     Log.i("FontPreviewTablet", "apkname : " + apkname + ", isCheckPlatformSignatures : " + this.isCheckPlatformSignatures + ", isCheckReleaseSignatures : " + this.isCheckReleaseSignatures); 
     if (!(this.isCheckPlatformSignatures || this.isCheckReleaseSignatures)) { 
      if (apkname.equals("")) { 
      } 
     } 
     return false; 
     } 
     continue; 
    } 
    } 
    if (DEBUG) { 
    Log.secD("FlipFont", "checkFont - check if valid certificate"); 
    } 
    PackageInfo packageInfo = null; 
    try { 
    packageInfo = this.mFontListAdapter.mPackageManager.getPackageInfo(apkname, 64); 
    } catch (Exception e) { 
    } 
    if (packageInfo != null) { 
    Signature[] signatures = packageInfo.signatures; 
    byte[] cert = signatures[0].toByteArray(); 
    try { 
     MessageDigest md = MessageDigest.getInstance("SHA"); 
     md.update(signatures[0].toByteArray()); 
     if ("T84drf8v3ZMOLvt2SFG/K7ODXgI=".equals(Base64.encodeToString(md.digest(), 0).trim())) { 
     if (DEBUG) { 
      Log.v("FlipFont", "**Signature is correct**"); 
     } 
     return false; 
     } 
     if (DEBUG) { 
     Log.v("FlipFont", "**Signature is incorrect**"); 
     } 
     return true; 
    } catch (Exception e2) { 
     e2.printStackTrace(); 
     InputStream input = new ByteArrayInputStream(cert); 
     CertificateFactory cf = null; 
     try { 
     cf = CertificateFactory.getInstance("X509"); 
     } catch (CertificateException e3) { 
     e3.printStackTrace(); 
     } 
     X509Certificate c = null; 
     try { 
     c = (X509Certificate) cf.generateCertificate(input); 
     } catch (CertificateException e32) { 
     e32.printStackTrace(); 
     } 
     if (DEBUG) { 
     Log.secD("Example", "APK name: " + apkname); 
     if (c != null) { 
      Log.secD("Example", "Certificate for: " + c.getSubjectDN()); 
      Log.secD("Example", "Certificate issued by: " + c.getIssuerDN()); 
      Log.secD("Example", "The certificate is valid from " + c.getNotBefore() + " to " + c.getNotAfter()); 
      Log.secD("Example", "Certificate SN# " + c.getSerialNumber()); 
      Log.secD("Example", "Generated with " + c.getSigAlgName()); 
     } 
     } 
     String certIssuedByString = "CN=Ed Platz, OU=Display Imaging, O=Monotype Imanging Inc., L=Woburn, ST=MA, C=US"; 
     if (c != null && certIssuedByString.equals(c.getIssuerDN().toString())) { 
     if (DEBUG) { 
      Log.secD("FlipFont", "**Certificate data is correct**"); 
     } 
     return false; 
     } 
    } 
    } 
    return true; 
} 

Wenn Sie bei dem obigen Verfahren betrachten, werden Sie feststellen, dass die APK-Signatur nicht geprüft wird, wenn das APK den Paketnamen "com.monotype.android.font.foundation" hat.

+0

So dos es bedeutet, es ist unmöglich zu machen, oder wenn ich com.monotype.android.font.foundation Paketnamen wird es funktioniert? –

+0

Wenn Sie den Paketnamen verwenden, funktioniert * dies möglicherweise *. Das Gerät verfügt möglicherweise bereits über ein APK mit diesem Paketnamen. –

+0

Ich habe gesehen, com.monotype.android.font.customname scheint Arbeit für einige ppl. Ich habe diese Methode nun ausprobiert um sie zu testen. –

1

Ich bin mir nicht sicher, ob es möglich ist, den Systemschrifttyp ohne Rooten zu ändern, aber Sie können die Systemschriftart ändern. Sie sollten dafür den String FONT_SCALE und einen Gleitkommawert verwenden. Ein Beispielcode-Snippet ist unten.

Settings.System.putFloat(getBaseContext().getContentResolver(), 
     Settings.System.FONT_SCALE, (float) 1.0); 

Beachten Sie, dass Sie die erforderliche WRITE_SETTINGS-Berechtigung zu Ihrer Android-Manifestdatei hinzufügen müssen.

Sie können den Rest der Dokumentation finden here

+0

Nun, Sie können in Frage sehen, ich habe Beispiel gegeben, wenn Sie Android-Handy haben Sie versuchen, es zu installieren erfordert keine Root-Erlaubnis –

+0

Es scheint, es gibt eine Ausnahme für ein paar Geräte einschließlich Samsung Galaxy Geräte zum Ändern der Systemschriftart ohne root. Gehen Sie wie folgt vor (wie gerootete Geräte): 1) Lesen Sie die Liste der Schriftarten und listen Sie diese auf. 2) Ändern Sie die Systemschriftart, wenn der Benutzer eine aus der Liste auswählt. 3) Wenn eine benutzerdefinierte Schriftart festgelegt werden soll, speichern Sie die gewünschte Schriftart-Datei unter/system/font/Verzeichnis von Android-Gerät programmgesteuert – Fio

+0

Ja stimme zu obwohl ich diese App um den Code zu dekompilieren, aber wie ich bin ein Anfänger in der Codierung ich denke, wenn jemand Codierung wissen, können sie helfen. es gibt nur eine Aktivität in dieser App Ich werde Code in Frage und etc –

Verwandte Themen