例如,针对联通定制版,要实现将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。
同理这里也要区分上面两种情况。