標籤:android io ar os 使用 sp java for 檔案
例如,針對聯通定製版,要實現將SIM卡應用程式名稱動態修改成電訊廠商名稱:
背景:
1. 由於SAT應用是動態安裝的,launcher菜單中的SIM卡應用表徵圖是Stk1.apk的表徵圖。
2. 電訊廠商的名稱是儲存在:
卡1: TelephonyProperties.PROPERTY_OPERATOR_ALPHA
卡2: TelephonyProperties.PROPERTY_OPERATOR_ALPHA_2
客制化步驟:
1. 從SystemProperty中擷取卡的電訊廠商名稱
1.1、GB3版本:
修改檔案:ContextImpl.java
具體修改如下:
import android.os.SystemProperties;
import com.android.internal.telephony.TelephonyProperties;
@Override
public CharSequence getText(String packageName, int resid,
ApplicationInfo appInfo) {
ResourceName name = new ResourceName(packageName, resid);
CharSequence text = getCachedString(name);
if (text != null) {
//add start
if(packageName.equalsIgnoreCase("com.android.stk")) {
Log.d("jby","packagemanager1,stkpackageName1:"+packageName);
String tmptext=SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ALPHA);
if(!tmptext.isEmpty())
if(!tmptext.equalsIgnoreCase("com.android.stk"))
text=tmptext;
}else if(packageName.equalsIgnoreCase("com.android.stk2")) {
Log.d("jby","packagemanager1,stkpackageName2:"+packageName);
String tmptext=SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ALPHA_2);
if(!tmptext.isEmpty())
if(!tmptext.equalsIgnoreCase("com.android.stk2"))
text=tmptext;
}
Log.d("jby","text="+text);
//add end
return text;
}
if (appInfo == null) {
try {
appInfo = getApplicationInfo(packageName, 0);
} catch (NameNotFoundException e) {
return null;
}
}
try {
Resources r = getResourcesForApplication(appInfo);
text = r.getText(resid);
putCachedString(name, text);
//add start
if(packageName.equalsIgnoreCase("com.android.stk")) {
Log.d("jby","packagemanager1,stkpackageName1:"+packageName);
String tmptext=SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ALPHA);
if(!tmptext.isEmpty())
if(!tmptext.equalsIgnoreCase("com.android.stk"))
text=tmptext;
} else if(packageName.equalsIgnoreCase("com.android.stk2")) {
Log.d("jby","packagemanager2,stkpackageName2:"+packageName);
String tmptext=SystemProperties.get(TelephonyProperties.PROPERTY_OPERATOR_ALPHA_2);
if(!tmptext.isEmpty())
if(!tmptext.equalsIgnoreCase("com.android.stk2"))
text=tmptext;
}
Log.d("jby","text="+text);
//add end
return text;
} catch (NameNotFoundException e) {
Log.w("PackageManager", "Failure retrieving resources for"
+ appInfo.packageName);
} catch (RuntimeException e) {
// If an exception was thrown, fall through to return
// default icon.
Log.w("PackageManager", "Failure retrieving text 0x"
+ Integer.toHexString(resid) + " in package "
+ packageName, e);
}
return null;
}
1.2、同理,JB2以及JB2以後的版本:
修改檔案:ApplicationPackageManager.java
具體修改:參考上述的GB3版本修改,基本一樣。
2. 使用步驟1中擷取的電訊廠商名字來動態修改package對應的app name(應用程式名稱字)
修改檔案:PagedViewIcon.java
KK以前的版本該檔案路徑: alps\packages\apps\launcher2\src\com\android\launcher2\
KK以後的版本該檔案路徑: alps\packages\apps\launcher3\src\com\android\launcher3\
2.1、GB3、GB5版本:
將applyFromApplicationInfo()方法中的setText,通過packageName來過濾,設定期望顯示的名字。
例如:packageName = “com.android.stk1”, 期望顯示的名字"我的名字"
if (packageName 等於info.componentName.mPackage)
{
setText("我的名字")
}
else
{
setText(info.title);
}
2.2、JB2以及JB2以後的版本
兩個stk應用程式是共用一個packageName的,所以無法通過包名來區分,必須通過類名來區分。例如插入卡槽2的sim或usim應用程式是通過啟動"stkLauncherActivityⅡ"。
因此,將applyFromApplicationInfo()方法中的setText,通過TargetclassName來過濾,設定期望顯示的名字。
例如:TargetclassName = “stkLauncherActivityⅡ”, 期望顯示的名字"我的名字"
if (TargetclassName 等於info.componentName.mClass)
{
setText("我的名字")
}
else
{
setText(info.title);
}
修改應用程式的捷徑名稱:
修改檔案:IconCache.java
KK以前的路徑:packages\apps\launcher2\src\com\android\launcher2\IconCache.java
KK以後的路徑:packages\apps\launcher3\src\com\android\launcher3\IconCache.java
具體修改:
將cacheLocked()方法中, 通過特殊判斷將要顯示的名字賦值給entry.title。
同理這裡也要區分上面兩種情況。
android STK名稱客制化