2017-10-12 37 views
8

我想知道是否有人有關於如何創建可以更改三星手機中的界面字體樣式的應用程序的任何想法。在TrueType格式中,我有我最喜歡的字體樣式。如何製作可以更改Android用戶界面字體的應用程序?

在Galaxy Apps商店中有很多字體樣式,但它們是付費的,而不是我想要的。您可以看到this應用程序爲例,安裝用戶後可以進入設置>設備>字體樣式>從列表中選擇字體並更改字體樣式。

我試過反編譯它,但沒有得到太多。換句話說,Flip Font應用程序。

反編譯源

<?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> 

只有一個活動

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

您可以更改操作系統字體大小,但不確定字體。 –

+0

爲什麼不把字體樣式放在資源中就像這個例子一樣?這是非常可以理解的...... https:// alvinalexander。COM/Android的上述問題,該應用程序不需要root權限 – gumuruh

回答

2

雖然股票的Android缺乏自定義系統字體的能力, 很多製造商已經適應了他們的軟件,以支持該 強烈要求的功能,讓您輕鬆改變字體爲 的Android

Source

這意味着沒有任何系統API可以讓插件使字體在所有Android設備上都能正常工作。但是,個別製造商確實提供了自定義字體實現。

我爲你做了一個快速搜索,但看起來這些製造商並沒有提供官方/通用的API(或者像Samsung這樣的模糊的API)來改變他們的字體,相反,你必須看看每個製造商的主題/字體實現(逆向工程?),並瞭解如何設置系統寬字體以及如何插入此係統。

如果您正在尋找根應用程序如何執行此操作的示例,則有許多操作字體的開源應用程序,like this

+0

大加讚賞的答案很長一段時間問問題,我在這裏做了很多之前等待 後/如何到設置字體大小,樣式的TextView-編程 –

+0

@DreamDeveloper不要誤會我的意思,有可能改變一些** **設備的主題,使用製造商特定的API。例如。你指的是美國應用「支持的設備:三星Galaxy設備」 – Mdlc

+0

你是對的,但我的第一個目標是MI星系設備我做了一個主題,但對於星系的設備,我需要做這個程序,真正快速 –

0

我想你不能這樣做,除非你需要root你的手機,因爲三星不允許你從一個應用程序更改字體,它需要有root permission但我不知道!

+0

我給的鏈接的在線搜索,但找不到任何答案,但如果你看應用程序(問題鏈接),你只是安裝它,然後你可以很容易地改變設置的字體,我認爲必須有一種方式,否則該應用程序wouldn'我不希望我的應用程序的用戶強制剷除他們的電話,我知道將不起作用 他們不會使用它 –

0

我需要用Monotype的keystore簽名APK。我/你沒有訪問權限。因此,您的APK無法在三星設備上使用。 下面的方法是從三星設備上設置應用程序反編譯,用來檢查FlipFont APK與正確的密鑰簽名:

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; 
} 

如果我/你看上面的方法,你會發現,如果APK的包名稱爲「com.monotype.android.font.foundation」,則不檢查APK簽名。

相關問題