读写其它 APP 的 SharedPreference
Android 4.2 以后已经不能读取其它 APP 的 SharedPreference
Android 不仅允许我们读写自己 APP 下的 SharedPreference
,还可以读写其它 APP 下的 SharedPreference
,所以,从某些方面说,保存在 SharedPreference
是不安全的
我们可以通过 包名 读写其它 APP 下 Context.MODE_WORLD_READABLE
或 Context.MODE_WORLD_WRITEABLE
操作模式下的 SharedPreference
数据
读写其它 APP 的 SharedPreference
读写其它 APP 的 SharedPreference
流程一般如下
-
根据应用的包名创建其它 APP 对应的
Context
拿我们前一章节开发的
SharedSave
做范例Context mspContext = createPackageContext("cn.twle.android.sharedsave")
需要注意的是,这个过程或抛出
NameNotFoundException
异常 -
根据
Context
获得对应的SharedPreference
SharedPreference sp = mspContext.getSharedPreferences("ms_sp", Context.MODE_WORLD_READABLE);
文件名和操作模式都要一一对应
-
调用对应的
getXxx()
方法根据键名获取数据String username = sp.getString("username");
范例
-
我们先把上一章节中帮助类
SharedHelper.java
中的Context.MODE_PRIVATE
改成Context.MODE_WORLD_READABLE
,然后重新运行一次,保存用户名到SharedPreference
中 -
创建一个 空的 Android 项目
cn.twle.android.ReadOtherShared
-
修改
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(); } }