读写其它 APP 的 SharedPreference

Android 4.2 以后已经不能读取其它 APP 的 SharedPreference

Android 不仅允许我们读写自己 APP 下的 SharedPreference,还可以读写其它 APP 下的 SharedPreference,所以,从某些方面说,保存在 SharedPreference 是不安全的

我们可以通过 包名 读写其它 APP 下 Context.MODE_WORLD_READABLEContext.MODE_WORLD_WRITEABLE 操作模式下的 SharedPreference 数据

读写其它 APP 的 SharedPreference

读写其它 APP 的 SharedPreference 流程一般如下

  1. 根据应用的包名创建其它 APP 对应的 Context

    拿我们前一章节开发的 SharedSave 做范例

    Context mspContext = createPackageContext("cn.twle.android.sharedsave")
    

    需要注意的是,这个过程或抛出 NameNotFoundException 异常

  2. 根据 Context 获得对应的 SharedPreference

    SharedPreference sp = mspContext.getSharedPreferences("ms_sp", Context.MODE_WORLD_READABLE);
    

    文件名和操作模式都要一一对应

  3. 调用对应的 getXxx() 方法根据键名获取数据

    String username = sp.getString("username");
    

范例


  1. 我们先把上一章节中帮助类 SharedHelper.java 中的 Context.MODE_PRIVATE 改成 Context.MODE_WORLD_READABLE ,然后重新运行一次,保存用户名到 SharedPreference

  2. 创建一个 空的 Android 项目 cn.twle.android.ReadOtherShared

  3. 修改 MainActivity.java 读取 SP,并通过 Toast 显示出来

    package cn.twle.android.readothershared
    
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.Toast;
    import android.content.SharedPreferences;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //获得第一个应用的包名,从而获得对应的 Context 需要对异常进行捕获
            try {
                Context othercontext = createPackageContext("cn.twle.android.sharedsave", Context.CONTEXT_IGNORE_SECURITY);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }
            //根据 Context 取得对应的 SharedPreferences
            SharedPreferences sp = othercontext.getSharedPreferences("ms_sp", Context.MODE_WORLD_READABLE);
            String name = sp.getString("username", "");
    
            Toast.makeText(getApplicationContext(), "SharedSave 的 SharedPreference 存的用户名为:" + name + ", Toast.LENGTH_LONG).show();
    
        }
    }
    

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.