2017-10-12 47 views
8

मैं जानना चाहता हूं कि किसी को ऐप बनाने के बारे में कोई जानकारी है या नहीं, जो सैमसंग फोन में इंटरफ़ेस फ़ॉन्ट शैली को बदल सकता है। मेरे पास ट्रू टाइप प्रारूप में मेरे साथ मेरी पसंदीदा फ़ॉन्ट शैली है।ऐप कैसे बनाएं जो एंड्रॉइड यूजर इंटरफेस फ़ॉन्ट को बदल सकता है?

गैलेक्सी ऐप स्टोर पर बहुत सारी फ़ॉन्ट शैली हैं लेकिन उन्हें भुगतान किया जाता है और जो भी मैं चाहता हूं। आप this ऐप को उदाहरण के रूप में देख सकते हैं कि उपयोगकर्ता इंस्टॉल करने के बाद क्या होता है बस सेटिंग> डिवाइस> फ़ॉन्ट स्टाइल> सूची से फ़ॉन्ट चुनें और फ़ॉन्ट शैली बदलें।

मैंने इसे अपनाने की कोशिश की है लेकिन इसमें से अधिक नहीं मिला है। या दूसरे शब्दों में, फ्लिप फ़ॉन्ट ऐप।

decompiled स्रोत

<?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/how-to-set-font-size-style-textview-programmatically – gumuruh

उत्तर

2

जबकि शेयर एंड्रॉयड आपके सिस्टम फ़ॉन्ट अनुकूलित करने की क्षमता का अभाव है, निर्माताओं में से बहुत सारे उनके सॉफ्टवेयर इस बहुत मांग थी सुविधा का समर्थन करने के लिए अनुकूलित किया है, तो आप आसानी के लिए फोंट बदलने की अनुमति देता एंड्रॉयड

Source

इसका मतलब है कि कोई सिस्टम एपीआई नहीं है जिसे आप फोंट को सभी एंड्रॉइड डिवाइसों पर काम करने के लिए प्लगइन कर सकते हैं। हालांकि, व्यक्तिगत विनिर्माण एक कस्टम फ़ॉन्ट कार्यान्वयन प्रदान करते हैं।

मैंने आपके लिए त्वरित खोज की, लेकिन ऐसा लगता है कि ये विनिर्माण आधिकारिक/सामान्यीकृत एपीआई (या Samsung जैसे अस्पष्ट लोगों को अपने फ़ॉन्ट बदलने के लिए) प्रदान नहीं करते हैं, इसके बजाय, आपको प्रत्येक विनिर्माण थीम को देखना होगा/फ़ॉन्ट कार्यान्वयन व्यक्तिगत रूप से (रिवर्स इंजीनियरिंग?), और पता लगाएं कि कैसे सिस्टम विस्तृत फ़ॉन्ट सेट हैं और आप इस सिस्टम में कैसे प्लग कर सकते हैं।

यदि आप रूट ऐप के बारे में एक उदाहरण की तलाश कर रहे हैं, तो ऐसे कई ओपन सोर्स ऐप्स हैं जो फ़ॉन्ट्स, like this में हेरफेर करते हैं।

+0

लंबे समय के बाद पर सवाल पूछने से पहले बहुत सराहना की गई जवाब मैंने बहुत कुछ किया ऑनलाइन खोज के लेकिन आपको कोई जवाब नहीं मिला लेकिन यदि आप ऐप (प्रश्न में लिंक) देखते हैं तो एपीके आप इसे इंस्टॉल करते हैं और फिर आप आसानी से सेटिंग से फ़ॉन्ट बदल सकते हैं, मुझे लगता है कि अन्यथा एक तरीका होना चाहिए कि ऐप ' टी काम मैं नहीं चाहता कि मेरे ऐप उपयोगकर्ता अपने फोन को रूट करने के लिए मजबूर हों, मुझे पता है कि वे इसका उपयोग नहीं करेंगे –

+0

@Dream डेवलपर मुझे गलत न करें, ** ** ** ** पर थीम को बदलना संभव है निर्माता विशिष्ट एपीआई। उदाहरण के लिए। ऐप जिसे आप राज्यों का जिक्र कर रहे हैं "समर्थित डिवाइस: सैमसंग गैलेक्सी डिवाइस" – Mdlc

+0

आप सही हैं लेकिन मेरा पहला लक्ष्य मील के लिए आकाशगंगा डिवाइस है, मैंने थीम बनाई लेकिन आकाशगंगा उपकरणों के लिए मुझे यह ऐप और वास्तव में त्वरित बनाना होगा –

0

मुझे लगता है कि आप इसे तब तक नहीं कर सकते जब तक कि आपको अपने फोन को रूट करने की आवश्यकता न हो, क्योंकि सैमसंग आपको किसी ऐप से फोंट बदलने की अनुमति नहीं देता है, जिसके लिए root permission है लेकिन मुझे यकीन नहीं है!

+0

मैंने उपरोक्त प्रश्न में लिंक दिया है कि ऐप को रूट अनुमति की आवश्यकता नहीं है –

0

मुझे/आपको मोनोटाइप की कीस्टोर के साथ एपीके पर हस्ताक्षर करने की आवश्यकता है। मैं/आपके पास इस तक पहुंच नहीं है। इसलिए, आपका एपीके सैमसंग उपकरणों पर काम नहीं करेगा। निम्न विधि एक सैमसंग डिवाइस पर सेटिंग आवेदन से decompiled है और अगर 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; 
} 

अगर मैं/आप उपरोक्त विधि को देखो आप देखेंगे कि यदि एपीके का "com.monotype.android.font.foundation" का पैकेज नाम है तो एपीके हस्ताक्षर की जांच नहीं की जाती है।

संबंधित मुद्दे