Android 4.0访问第三方的sharedPreferences数据
Android 4.0访问第三方的sharedPreferences数据
我花了一天的时间研究,修改第三方的国笔输入法的手写默认显示方式,原先是全屏模式,我要改为非全屏模式。
首先把国笔输入法生成的sharedPreferences文件拷贝出来,查看显示全屏与非全屏的关键字。
但是2.3系统使用
try {
otherAppsContext=createPackageContext("com.guobi.gbime", CONTEXT_IGNORE_SECURITY );
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
Log.i("guobi", e.getMessage());
}
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("com.guobi.gbime_preferences", Context.MODE_WORLD_READABLE);
String name2 = sharedPreferences.getString("HandwriteFrameType", "");是可以获取到数据,而4.0就不行,打印的是空。
最终发现主要是权限问题。
国笔输入法生成的sharedPreferences文件是rw- rw- ---,,所以我们必须改变它的权限进行操作,其实目录也要改权限,都改为777。我在launcher的oncreate()方法中加入以下代码
//修改国笔输入法的显示模式,把全屏改为非全屏模式
xmlFile = new File("/data/data/com.guobi.gbime/shared_prefs/com.guobi.gbime_preferences.xml");
if(xmlFile.exists())
{
try {
Runtime.getRuntime().exec(new String[]{"su","-c","chmod 777 /data/data/com.guobi.gbime/shared_prefs/com.guobi.gbime_preferences.xml"});
Log.i("guobi", "chmod 777");
Runtime.getRuntime().exec(new String[]{"su","-c","rm /data/data/com.guobi.gbime/shared_prefs/com.guobi.gbime_preferences.xml"});
Log.i("guobi", " rm");
Runtime.getRuntime().exec(new String[]{"su","-c","touch /data/data/com.guobi.gbime/shared_prefs/com.guobi.gbime_preferences.xml"});
Log.i("guobi", " touch");
Runtime.getRuntime().exec(new String[]{"su","-c","chmod 777 /data/data/com.guobi.gbime/shared_prefs/com.guobi.gbime_preferences.xml"});
Log.i("guobi", " chomd");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
if(!xmlFile.getParentFile().exists())
{
try {
Runtime.getRuntime().exec(new String[]{"su","-c","mkdir /data/data/com.guobi.gbime/shared_prefs"});
Log.i("guobi", "mkdir");
Runtime.getRuntime().exec(new String[]{"su","-c","chmod 777 /data/data/com.guobi.gbime/shared_prefs"});
Log.i("guobi", " chomd");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
Runtime.getRuntime().exec(new String[]{"su","-c","touch /data/data/com.guobi.gbime/shared_prefs/com.guobi.gbime_preferences.xml"});
Log.i("guobi", "touch");
Log.i("guobi", "chmod 777");
Runtime.getRuntime().exec(new String[]{"su","-c","chmod 777 /data/data/com.guobi.gbime/shared_prefs/com.guobi.gbime_preferences.xml"});
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
otherAppsContext=mContext.createPackageContext("com.guobi.gbime",mContext. CONTEXT_IGNORE_SECURITY );
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
Log.i("guobi", e.getMessage());
}
SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("com.guobi.gbime_preferences", Context.MODE_WORLD_READABLE);
{
SharedPreferences.Editor guobieditor=sharedPreferences.edit();
guobieditor.putString("HandwriteLang", "china");
guobieditor.putString("HandwriteFrameType", "box");
guobieditor.putString("IMType", "pinyin");
guobieditor.putString("KeyboardType", "26");
guobieditor.putString("HandwriteStrokeMask", "normal");
guobieditor.putString("SkinType", "default");
guobieditor.commit();
String name2 = sharedPreferences.getString("HandwriteFrameType", "");
Log.i("guobi", "HandwriteFrameType--"+name2);
}
不要高兴太早,这只是成功了一半,你如果加在launcher中,会发现,每次设置为全屏模式后,要重启两次才能变成非全屏,后了我发现了,原来这是默认的输入法,他每次都是在launcher启动完之前就启动了,所以我们需要放在Launcher应用启动之前去把数据写进去才能成功。这就要考验我们对Android的启动流程有所了解。
android4.0/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有个方法叫startHomeActivityLocked(),这个方法是条用启动launcher的方法,我们在最前面加入上面的代码,launcher中的不需要。OK大功告成。每次启动都是默认为非全屏模式。
评论暂时关闭