android4.0访问第三方的sharedPreferences数据

来源:互联网 发布:vr头显 知乎 定位 编辑:程序博客网 时间:2024/06/05 12:44

我花了一天的时间研究,修改第三方的国笔输入法的手写默认显示方式,原先是全屏模式,我要改为非全屏模式。

首先把国笔输入法生成的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大功告成。每次启动都是默认为非全屏模式。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小孩不爱吃饭怎么办该吃些什么 二个月宝宝只认母乳不喝牛奶怎么办 满月宝宝只认奶粉不认母乳怎么办 宝宝四个月只认奶瓶不认母乳怎么办 新生儿只认奶瓶不认母乳怎么办 7个月宝宝不吃辅食怎么办 8个月小孩不吃辅食怎么办 9个月小孩不吃辅食怎么办 十一个月宝宝拉肚子拉水怎么办 小孩好动上课也坐不住会怎么办 幼儿大班关于环保的手抄报怎么办 捷达车打开丝位子风扇总转怎么办 小班个案分析:好动的孩子该怎么办 孩子突然过于的兴奋不睡觉是怎么办 刚出生的宝宝听力未通过怎么办 孩子多动症被老师打不上学怎么办 小孩在校被学生打家长该怎么办? 8岁儿童好动上课不注意听课怎么办 怀孕第一个月喝了啤酒怎么办 不知道自己怀孕喝了酒怎么办 怀孕一个月不知道喝酒了怎么办 老师说孩子上课不专心听讲怎么办 二年级孩子上课不认真听讲怎么办 二年级的孩子浮躁上课不认真怎么办 三年级的小孩上课不认真听讲怎么办 大班孩子上课不专心听讲玩怎么办 老师跟家长说小孩上课讲话怎么办 别的家长动手打自己的孩子怎么办? 一岁3个月宝宝骨龄偏小怎么办 宝宝9个月了越来越粘人怎么办? 孩子突然说话结巴口吃了怎么办啊 很久不说话了不敢说话了怎么办 宝宝2岁了还不会说话怎么办 2岁的宝宝还不会说话怎么办 小宝宝有四个月了母乳不够吃怎么办 一个月的宝宝吐奶厉害怎么办 新生儿吐奶吐一次吐的特别多怎么办 把孩子打了一次现在说话结巴怎么办 宝宝五岁了口吃越来越严重了怎么办 幼儿把自己的舌头扣破皮了怎么办 6岁宝贝烧到39度怎么办