如何访问android中其他应用程序的共享prefrence数据?

时间:2016-07-06 02:47:18

标签: android android-sharedpreferences

我有两个app app,名为" A"和另一个名为" B" ,方案类似于应用程序B集成在应用程序A中,而应用程序B有一个名为CLoginSessionManagement的类,其中包含存储在该类中的用户数据的代码。我想要在App" A"从CLoginSessionManagement访问用户数据,并在用户登录时生成条件。我怎么能这样做?

CLoginSessionManagement的代码:

public class CLoginSessionManagement {
    // User name (make variable public to access from outside)
    public static final String s_szKEY_MOBILE = "agentcode";
    // Email address (make variable public to access from outside)
    public static final String s_szKEY_PASSWORD = "pin";
    // Sharedpref file name
    private static final String s_szPREF_NAME = "LoginData";
    // All Shared Preferences Keys
    private static final String s_szIS_LOGIN = "IsLoggedIn";
    private final SharedPreferences m_LOGIN_PREF;
    private final Editor m_EDITOR;
    private final Context m_CONTEXT;


    // Constructor
    @SuppressLint("CommitPrefEdits")
    public CLoginSessionManagement(Context m_CONTEXT) {
        this.m_CONTEXT = m_CONTEXT;
        m_LOGIN_PREF = m_CONTEXT.getSharedPreferences(s_szPREF_NAME, Context.MODE_PRIVATE);
        m_EDITOR = m_LOGIN_PREF.edit();
    }


    // Registeration Session Management....
    public void setLoginData(String mobile, String pin) {
        m_EDITOR.putBoolean(s_szIS_LOGIN, true);
        m_EDITOR.putString(s_szKEY_MOBILE, mobile);
        m_EDITOR.putString(s_szKEY_PASSWORD, pin);
        m_EDITOR.commit();
    }

    /**
     * checkLogin() session wil check user Login status
     * If false it will redirect user to Login page
     * Else won't do anything
     */
    public boolean checkLogin() {
        if (!isLogin()) {
            Intent i = new Intent(m_CONTEXT, CMainActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            m_CONTEXT.startActivity(i);
            return true;
        }
        return false;
    }

    /**
     * Get stored Login session data
     */
    public HashMap<String, String> getLoginDetails() {
        HashMap<String, String> user = new HashMap<>();
        // user name
        user.put(s_szKEY_MOBILE, m_LOGIN_PREF.getString(s_szKEY_MOBILE, null));
        // user email id
        user.put(s_szKEY_PASSWORD, m_LOGIN_PREF.getString(s_szKEY_PASSWORD, null));
        // return user
        return user;
    }

    public boolean isLogin() {
        return m_LOGIN_PREF.getBoolean(s_szIS_LOGIN, false);
    }

    /**
     * Clear session details
     */
    public void logoutUser() {
        // Clearing all data from Shared Preferences
        m_EDITOR.clear();
        m_EDITOR.commit();
        @SuppressWarnings("UnusedAssignment") final AppCompatActivity activity = (AppCompatActivity) m_CONTEXT;
        Intent i = new Intent(m_CONTEXT, CLoginScreen.class);
        // Closing all the Activities
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

        // Add new Flag to start new Activity
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        // Staring Login Activity
        m_CONTEXT.startActivity(i);
        ((AppCompatActivity) m_CONTEXT).finish();

    }
}

m_oLoginSession = new CLoginSessionManagement(CLoginScreen.this);// object creatiion of Login session.

3 个答案:

答案 0 :(得分:0)

我只是看看android开发文档,它声明SharedPreferences对您的应用程序是私有的。您可以尝试内容提供商:

  

Android提供了一种方法,您可以使用内容提供商将您的私人数据公开给其他应用程序。

参考链接:

答案 1 :(得分:0)

由于SharedPreferences受android-os保护,因此您必须将内容存储并加载到两个应用程序都可以读/写的文件目录中。

执行此操作的技巧用您自己的代码替换android-sandbox Context

而不是调用MyActivity.this.getSharedPreferences(...),而是使用

Context context = new PublicPreferencesContext(MyActivity.this);
context.getSharedPreferences(...);

这是所有魔法发生的地方:

class PublicPreferencesContext extends ContextWrapper {
    public PublicPreferencesContext(Context base) {
        super(base);
    }

    // overwrite the shared-preferences specific functions here
    // getSharedPreferences, ...
}

我做过类似change the location where the database is stored的事情,效果很好。这样做也可以使用SharedPreferences。

如果这对你有用,请告诉我们,并为我们提供PublicPreferencesContext

的完整源代码

答案 2 :(得分:-1)

SharedPreferences只存在自己的包  你可以尝试学习:

  1. content provider
  2. aidl (IPC)