在 Android 本地存储中存储访问令牌?

Store Access Token in Android Local Storage?

我无法在 SharedPreferences.How 中存储访问令牌、用户名,这可以完成吗?

登录Class

   public class Login extends AppCompatActivity implements View.OnClickListener {


EditText userName, Password;
Button login;
public static final String LOGIN_URL = "http://192.168.100.5:84/Token";
public static final String KEY_USERNAME = "UserName";
public static final String KEY_PASSWORD = "Password";
String username, password, accesstoken, tokentype;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    userName = (EditText) findViewById(R.id.login_name);
    Password = (EditText) findViewById(R.id.login_password);
    userName.setHint(Html.fromHtml("<font color='#008b8b' style='italic'>Username</font>"));
    Password.setHint(Html.fromHtml("<font color='#008b8b'>Password</font>"));
    login = (Button) findViewById(R.id.login);
    login.setOnClickListener(this);
}

private void UserLogin() {

    username = userName.getText().toString().trim();
    password = Password.getText().toString().trim();


    StringRequest stringRequest = new StringRequest(Request.Method.POST, LOGIN_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    try {
                        JSONObject jsonObject = new JSONObject(response);
                        accesstoken = jsonObject.getString("access_token");
                        tokentype = jsonObject.getString("token_type");
                        SessionManagement session = new SessionManagement(Login.this);
                        session.createLoginSession(accesstoken);
                        openProfile();

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(Login.this, error.toString(), Toast.LENGTH_LONG).show();
                }
            }) {


        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            //  params.put("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
            return params;
        }


        @Override
        protected Map<String, String> getParams() {
            Map<String, String> map = new HashMap<String, String>();
            map.put(KEY_USERNAME, username);
            map.put(KEY_PASSWORD, password);
            map.put("grant_type", "password");
            return map;
        }
    };


    stringRequest.setRetryPolicy(new DefaultRetryPolicy(
            60000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));


    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}


private void openProfile() {
    Intent intent = new Intent(this, Home.class);
    intent.putExtra(KEY_USERNAME, username);
    startActivity(intent);
}

@Override
public void onClick(View v) {


    UserLogin();
}

}

会话管理class

   public class SessionManagement {
    SharedPreferences pref;
    SharedPreferences.Editor editor;
    Context _context;

    // Shared pref mode
    int PRIVATE_MODE = 0;

    // Sharedpref file name
    private static final String PREF_NAME = "AndroidHivePref";


    private static final String IS_LOGIN = "IsLoggedIn";


    public static final String KEY_USERNAME = "UserName";

    public static final String KEY_access_token = "access_token";
    public static final String KEY_TOKEN_TYPE = "token_type";
    public static final String KEY_MASTER_ID = "MasterID";
    public static final String KEY_NAME = "Name";
    public static final String KEY_Access = "Name";


    // Constructor
    public SessionManagement(Context context) {
        this._context = context;
        pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
        editor = pref.edit();
    }

    /**
     * Create login session
     */
    public void createLoginSession(String username, String accesstoken, String tokentype, String masterid, String name, Integer access) {
        // Storing login value as TRUE
        editor.putBoolean(IS_LOGIN, true);
        editor.putString(KEY_USERNAME, username);
        // Storing name in pref
        editor.putString(KEY_access_token, accesstoken);

        // Storing email in pref
        editor.putString(KEY_TOKEN_TYPE, tokentype);

        editor.putString(KEY_MASTER_ID, masterid);
        editor.putString(KEY_TOKEN_TYPE, tokentype);
        editor.putString(KEY_NAME, name);
        editor.putInt(KEY_Access, access);


        // commit changes


        String user_name_new = pref.getString(KEY_USERNAME, null);

        Log.d("TAG", "Pass user name :" + username + " user_name_new:" + user_name_new);
        editor.commit();

    }

    /**
     * Check login method wil check user login status
     * If false it will redirect user to login page
     * Else won't do anything
     */
    public void checkLogin() {
        // Check login status
        if (!this.isLoggedIn()) {
            // user is not logged in redirect him to Login Activity
            Intent i = new Intent(_context, Login.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
            _context.startActivity(i);
        }

    }


    /**
     * Get stored session data
     */
    public HashMap<String, String> getUserDetails() {
        HashMap<String, String> user = new HashMap<String, String>();
        // user name
        user.put(KEY_USERNAME, pref.getString(KEY_USERNAME, null));
        user.put(KEY_access_token, pref.getString(KEY_access_token, null));

        user.put(KEY_TOKEN_TYPE, pref.getString(KEY_TOKEN_TYPE, null));
        user.put(KEY_MASTER_ID, pref.getString(KEY_MASTER_ID, null));
        user.put(KEY_access_token, pref.getString(KEY_access_token, null));
        user.put(KEY_NAME, pref.getString(KEY_NAME, null));
        user.put(KEY_Access, pref.getString(KEY_Access, null));


        // return user
        return user;
    }

    /**
     * Clear session details
     */
    public void logoutUser() {

        editor.clear();
        editor.commit();

        // After logout redirect user to Loing Activity
        Intent i = new Intent(_context, Login.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
        _context.startActivity(i);
    }

    /**
     * Quick check for login
     **/
    // Get Login State
    public boolean isLoggedIn() {
        return pref.getBoolean(IS_LOGIN, false);
    }

}

如何在登录CLass中使用SessionManagementClass在本地存储信息??

试试这个,

    if (response.trim().equals("success")) {

        //add these 2 lines
        SessionManagement session=new SessionManagement(Login.this);
        session.createLoginSession(username, accesstoken,tokentype, masterid,name, access);

        openProfile();
    } else {
        Toast.makeText(Login.this, response, Toast.LENGTH_LONG).show();
    }

编辑您的 createLoginSession 函数:

 /**
 * Create login session
 * */
public void createLoginSession(String username, String accesstoken,String tokentype, String masterid,String name, Integer access){
    // Storing login value as TRUE


    editor.putBoolean(IS_LOGIN, true);
    editor.putString(KEY_USERNAME, username);
    // Storing name in pref
    editor.putString(KEY_access_token, accesstoken);

    // Storing email in pref
    editor.putString(KEY_TOKEN_TYPE, tokentype);

    editor.putString(KEY_MASTER_ID, masterid);
    editor.putString(KEY_TOKEN_TYPE, tokentype);
    editor.putString(KEY_NAME, name);
    editor.putInt(KEY_Access, access);




    // commit changes
    editor.commit();


    String user_name_new=pref.getString(KEY_USERNAME, null)

    Log.d("TAG","Pass user name :"+username+" user_name_new:"+user_name_new);
}

您可以使用共享首选项来保存登录 details/access 令牌。请查看代码片段。

public class Preferences {
public static void setAccessToken(@NonNull Context context, String token) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MySharedPref", Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString("ACCESSTOKEN", token);
    editor.apply();
}

public static String getAccessToken(@NonNull Context context) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("MySharedPref", Context.MODE_PRIVATE);
    return sharedPreferences.getString("ACCESSTOKEN", null);
}}

同样,您可以将用户名和密码存储到共享首选项中,并根据需要检索它们。

按照这些步骤将任何类型的数据保存在本地存储中将完美运行,因为这是我的应用程序的 运行 代码。

  1. Firstly create a static instance of your application in your application class. And in this application class make static instance of your PreferenceManager class where all operations will done.
public class MyApp extends Application {

public static MyApp myApp ;
public static MyPreferenceManager myPreferenceManager;

@Override
public void onCreate() {
    super.onCreate();

    myApp = this;

  }

/*For creating the context of the Whole app.*/
public static MyApp getInstance() {
    return myApp ;
}

/*This is for getting the instance of the MyPreferenceManager class using the context of MyApp App.*/
public static MyPreferenceManager getPreferenceManager() {
    if (myPreferenceManager == null) {
        myPreferenceManager = new MyPreferenceManager(getInstance());
    }

    return myPreferenceManager;
}

}
  1. Now code of your MyPreferenceManager class :
public class MyPreferenceManager {

Context context;

SharedPreferences sharedPreferences;

SharedPreferences.Editor editor;

private static final String PREF_NAME = "com.example.App";

public static final String KEY_ID = "id";
public static final String KEY_ACCESS_TOKEN = "access_token";

public MyPreferenceManager(Context context) {

    this.context = context;

    sharedPreferences = context.getSharedPreferences(PREF_NAME,   Context.MODE_PRIVATE);

    editor = sharedPreferences.edit();

    editor.apply();

}

public void putString(String key, String value) {

    editor.putString(key, value);

    editor.apply();

}

public String getString(String key) {

    return sharedPreferences.getString(key, null);

}

//Method to clear the login data of the application.
public void clearLoginData() {

    editor.remove(KEY_ID);
    editor.remove(KEY_ACCESS_TOKEN);
    editor.apply();

}

}
  1. Now from any where you can save data to local storage from this code below.
MyApp.getInstance().getPreferenceManager().putString(MyPreferenceManager.KEY_ID, "1");
MyApp.getInstance().getPreferenceManager().putString(MyPreferenceManager.KEY_ACCESS_TOKEN, "oihfodfdshfhfoifhoifh3393");
  1. Now from any where you can get data from local storage from this code below.
String id = MyApp.getInstance().getPreferenceManager().getString(MyPreferenceManager.KEY_ID);
String accessToken = MyApp.getInstance().getPreferenceManager().getString(MyPreferenceManager.KEY_ACCESS_TOKEN);

Thanks.