如何在Android中访问其他应用程序的共享首选项数据?

4
我有两个应用程序,一个名为“A”,另一个名为“B”。场景是这样的,app B被集成在app A中,App B有一个类叫做CLoginSessionManagement,其中包含用户数据存储的代码。我想在App“A”中从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

由于SharedPreferences受Android操作系统保护,您必须将内容存储和加载到两个应用程序都可以读写的文件目录中。

要做到这一点的诀窍是用自己的代码替换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, ...
}

我已经做过类似于更改数据库存储位置的事情,效果非常好。使用SharedPreferences也应该可以实现这个功能。

如果这对你有用,请告诉我们并提供PublicPreferencesContext的完整源代码。


-1

SharedPreferences 只存在于自己的包中。你可以尝试学习以下内容:

  1. 内容提供者(content provider)
  2. AIDL(IPC)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接