I am saving my UserId on SharedPreference for future use. But that data getting cleared if I close that app or kill the app.
code used to save:
SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
SharedPreferences.Editor editor = app_preferences.edit();
editor.clear();
editor.putString("USERID", valu1);
editor.apply();
code to retrieve :
SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
userID = app_preferences.getString("USERID", "");
Any suggestions?
The apply() method is asynchronous and works on a background thread. It caches the data in RAM and waits until it has sufficient resources to write the data to permanent storage. Considering this, if you immediately close your app, you might lose data. Unlike apply(), commit runs on the UI thread and synchronously, do it has a guaranteed write but pauses the UI thread for a moment. The wait is insignificant though. Consider using commit() instead of apply() and see if it is helpful.
Make one session manger for that, which is separated class.
public class SessionManager {
SharedPreferences pref;
Editor editor;
Context _context;
int PRIVATE_MODE = 0;
private static final String PREF_NAME = "Android_Session";
private static final String IS_LOGIN = "IsLoggedIn";
// User name, Email,Id (make variable public to access from outside)
public static final String KEY_PHONE = "phone";
public static final String KEY_EMAIL = "email";
public static final String KEY_ID = "id";
// Constructor
public SessionManager(Context context) {
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
/**
* Create login session when user login first time call this.
*/
public void createLoginSession(String phone, String email, String id) {
editor.putBoolean(IS_LOGIN, true);
editor.putString(KEY_PHONE, phone);
editor.putString(KEY_EMAIL, email);
editor.putString(KEY_ID, id);
editor.commit();
}
/**
* Check user is login or not if not.
* This will used in dynamic app where session expired from server sideit will redirect to login page.
*/
public void checkLogin() {
if (!this.isLoggedIn()) {
// user is not logged in then redirect to Login Activity
Intent i = new Intent(_context, Login.class);
// Add flags launch modes
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(i);
}
}
/**
* Get stored session data
*/
public HashMap<String, String> getUserDetails() {
HashMap<String, String> user = new HashMap<String, String>();
user.put(KEY_PHONE, pref.getString(KEY_PHONE, null));
user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
user.put(KEY_ID, pref.getString(KEY_ID, null));
return user;
}
/**
* Clear session details
*/
public void logoutUser() {
editor.clear();
editor.commit();
// After logout redirect user to Login Activity
Intent i = new Intent(_context, Login.class);
// Add Flags (Launch Modes)
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
_context.startActivity(i);
}
/**
* Check if user login or not
**/
public boolean isLoggedIn() {
return pref.getBoolean(IS_LOGIN, false);
}
}
Now to retrieve values like
SessionManager session = new SessionManager(getApplicationContext());
HashMap<String, String> user = session.getUserDetails();
String id = user.get(SessionManager.KEY_ID);
To identify login
SessionManager session = new SessionManager(getApplicationContext());
if (!session.isLoggedIn()) {
//ToDo
} else {
}
Related
First of, allow me to point out that am new to android development and at this very moment am trying to store a user login session using SharedPreferences and having done a bit to create myself a class SessionManager to handle that, i got no error anyways but, each time i logged in, am quickly redirected to the LoginActivty again.
SessionManager.java
package com.example.drawerlayout;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import java.util.HashMap;
public class SessionManager {
SharedPreferences sharedPreferences;
public SharedPreferences.Editor editor;
public Context context;
int PRIVATE_MODE = 0;
private static final String PREF_NAME = "LOGIN";
private static final String LOGIN = "IS_LOGIN";
public static final String NAME = "NAME";
public static final String EMAIL = "EMAIL";
public static final String TYPE = "TYPE";
public SessionManager(Context context) {
this.context = context;
sharedPreferences = context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = sharedPreferences.edit();
}
public void createSession(String name, String email, String type){
editor.putBoolean(PREF_NAME, true);
editor.putString(NAME, name);
editor.putString(EMAIL, email);
editor.putString(TYPE, type);
editor.apply();
}
public boolean isLoggedIn(){
return sharedPreferences.getBoolean(LOGIN, false);
}
public void checkLoggin(){
if (!this.isLoggedIn()){
Intent i = new Intent(context, LoginActivity.class);
context.startActivity(i);
((MainActivity) context).finish();
}
}
public HashMap<String, String> getUserDetails(){
HashMap<String, String> user = new HashMap<>();
user.put(NAME, sharedPreferences.getString(NAME, null));
user.put(EMAIL, sharedPreferences.getString(EMAIL, null));
user.put(TYPE, sharedPreferences.getString(TYPE, null));
return user;
}
public void logOut(){
editor.clear();
editor.commit();
Intent i = new Intent(context, LoginActivity.class);
context.startActivity(i);
((MainActivity) context).finish();
}
}
and SessionManager.java is used in LoginActivity like so:
String name = details.getString("username").trim();
String email = details.getString("email").trim();
String type = details.getString("type").trim();
//CREATE SESSION
sessionManager.createSession(name,email,type);
and in MainActivity.java like
sessionManager = new SessionManager(this);
sessionManager.checkLoggin();
You are updating wrong key in createSession method.
Replace PREF_NAME with LOGIN in createSession. And your code will work as expected.
public void createSession(String name, String email, String type){
// Check below line...
editor.putBoolean(LOGIN, true);
editor.putString(NAME, name);
editor.putString(EMAIL, email);
editor.putString(TYPE, type);
editor.apply();
}
See your String variable names once again!
String PREF_NAME is for getting the preference.
String LOGIN is for addressing the value to check if the user is logged in or not
Your Mistake:
Function createSession(String name, String email, String type)
You are updating the value of String PREF_NAME instead of String LOGIN
Solution:
Function createSession(String name, String email, String type)
Updating the value of String LOGIN instead of String PREF_NAMEin line no 29 of SessionManager.java
Most probably you have forgotten to put a boolean field LOGIN in your session manager's create session.. modify createSession Method as below
public void createSession(String name, String email, String type,Boolean isLoggedIn){
editor.putString(NAME, name);
editor.putString(EMAIL, email);
editor.putString(TYPE, type);
editor.putBoolean(LOGIN,isLoggedIn)
editor.apply();
}
And then if login success in login activity then call like this
String name = details.getString("username").trim();
String email = details.getString("email").trim();
String type = details.getString("type").trim();
//CREATE SESSION
sessionManager.createSession(name,email,type,true);
alright sharedpreference values are saving in xml file which contain its key and value so each of value will be generate on first attempt of login so why don't you check if any value is exists in sharedpreference or not by this way.. put this code to your sessionHandler
public static boolean preferenceExists(String key){
return sharedPreferences.contains(key);
}
it will return boolean flag if any value is exists there or not so simply do check if preferenceExists() or not.... if not then redirect it do login activity else redirect where you want
suggestion : create splashscreen where you can verify these things
I implemented code for Session Management day before yesterday It's working properly but now It's giving an error on getString() please check this below code and tell me where I am wrong.
public class SessionManager {
SharedPreferences pref;
SharedPreferences.Editor editor;
Context _context;
int PRIVATE_MODE = 0;
private static final String PREF_NAME = "MaangalPref";
private static final String IS_LOGIN = "IsLoggedIn";
public static final String KEY_PASSWORD = "name";
public static final String KEY_EMAIL = "email";
public static final String KEY_GENDER = "gender";
public SessionManager(Context context){
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
public SessionManager() {}
Create login session
public void createLoginSession(String name, String email, String gender){
editor.putBoolean(IS_LOGIN, true);
editor.putString(KEY_PASSWORD, name);
editor.putString(KEY_EMAIL, email);
editor.putString(KEY_GENDER, gender);
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(){
if(!this.isLoggedIn()){
Intent i = new Intent(_context, AuthenticActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(i);
}
}
Get stored session data
public HashMap<String, String> getUserDetails(){
HashMap<String, String> user = new HashMap<String, String>();
user.put(KEY_PASSWORD, pref.getString(KEY_PASSWORD, null));
user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
user.put(KEY_GENDER,pref.getString(KEY_GENDER, null));
return user;
}
public void logoutUser(){
editor.clear();
editor.commit();
Intent i = new Intent(_context, AuthenticActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(i);
}
public boolean isLoggedIn(){
return pref.getBoolean(IS_LOGIN, false);
}
}
onCreate method of Fragment Class
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Session class instance
session = new SessionManager();
// get user data from session
HashMap<String, String> user = session.getUserDetails();
email = user.get(SessionManager.KEY_EMAIL);
Log.e("email________NewMatches",email);
DATA_URL = "http://192.168.2.110/xp/new_matches.php?matri_id="+email;
Log.e("URL________NewMatches",DATA_URL);
}
I think your are calling empty constructor of SessionManager in tab fragment like
session = new SessionManager();
that you are declared in your SessionManager class
public SessionManager(Context context){
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
public SessionManager() {}
so finally use in tab fragment
session = new SessionManager(getContext()); //give context of class
instead of session = new SessionManager();
use below code
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Session class instance
session = new SessionManager(getContext()); //here you have to change
// get user data from session
HashMap<String, String> user = session.getUserDetails();
email = user.get(SessionManager.KEY_EMAIL);
Log.e("email________NewMatches",email);
DATA_URL = "http://192.168.2.110/xp/new_matches.php?matri_id="+email;
Log.e("URL________NewMatches",DATA_URL);
}
and also remove empty constructor from SessionManager for future purpose....
I'm storing data on sharedpreferences when user is logged in and setting it in a textview. I want to remove one specific data when user logged out. The problem is data is being stored but not removing. I have tried below code.
public class SessionManager {
SharedPreferences pref;
SharedPreferences.Editor editor;
Context _context;
int PRIVATE_MODE = 0;
private static final String PREF_NAME = "NaafcoPref";
private static final String IS_LOGIN = "IsLoggedIn";
public static final String KEY_ID = "id";
public static final String KEY_RESULT = "result";
public static final String SCAN_RESULT = "s_result";
public SessionManager(Context context) {
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
public void createLoginSession(String id) {
editor.putBoolean(IS_LOGIN, true);
editor.putString(KEY_ID, id);
editor.commit();
}
public void getResult(String result) {
editor.putBoolean(IS_LOGIN, true);
editor.putString(KEY_RESULT, result);
editor.commit();
}
public void getScanResult(String scanResult) {
editor.putString(SCAN_RESULT, scanResult);
editor.commit();
}
public void checkLogin() {
if (!this.isLoggedIn()) {
Intent i = new Intent(_context, PointActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(i);
}
}
public HashMap<String, String> getUserDetails() {
HashMap<String, String> user = new HashMap<String, String>();
user.put(KEY_ID, pref.getString(KEY_ID, null));
user.put(KEY_RESULT, pref.getString(KEY_RESULT, null));
user.put(SCAN_RESULT, pref.getString(SCAN_RESULT, null));
return user;
}
public void logoutUser() {
editor.remove(SCAN_RESULT).clear().commit();
//editor.clear();
//editor.commit();
Intent i = new Intent(_context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(i);
}
public boolean isLoggedIn() {
return pref.getBoolean(IS_LOGIN, false);
}
}
To remove specific values: SharedPreferences.Editor.remove() followed by a commit()
To remove them all SharedPreferences.Editor.clear() followed by a commit()
If you don't care about the return value and you're using this from your application's main thread, consider using apply() instead.
Try this,
public void logoutUser() {
SharedPreferences sp = Preferences.getInstance().pref;
SharedPreferences.Editor editor = sp.edit();
editor.remove(SCAN_RESULT);
editor.commit();
Intent i = new Intent(_context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(i);
}
You need to reinitialize sharepreference editer to clear data
public void logoutUser() {
editor = pref.edit();
editor.clear().commit();
Intent i = new Intent(_context, MainActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
_context.startActivity(i);
}
Try implementing this for logout:
/**
* Clear All user preferences
* Use this when user logs out
*/
public void clearPreferences() {
isLoggedIn(); // this will set the login as false
pref.edit().clear().apply();
//also clear from default preferences
SharedPreferences defaultPref = PreferenceManager.getDefaultSharedPreferences(context);
defaultPref.edit().clear().apply();
}
First you need to create singleton class like PreferenceManager
private PreferenceManager(Context ctx) {
prefs = ctx.getApplicationContext().getSharedPreferences(ctx.getPackageName(), Context.MODE_PRIVATE);
editor = prefs.edit();
}
public static PreferenceManager getInstance(Context ctx) {
if (sInstance == null) {
sInstance = new PreferenceManager(ctx);
}
return sInstance;
}
You can use below snippet
public void clearPreference() {
editor.remove("your preference key that you want to clear");
.
.add all preference key that you want to clear
.
editor.commit();
}
SharedPreferences pref = context.getSharedPreferences("s_result", Context.MODE_PRIVATE);
pref.edit().clear().commit();
I am using social auth for integration of social app like facebook, google and many more. I successfully authorized and access token is printed in logcat but i want to store them for send to api.
class SignUp extends Activity
{
SocialAuthAdapter adapter;
public void onCreate(Bundle SavedBundleInstanceState )
{
adapter = new SocialAuthAdapter(new ResponseListener());
adapter.authroize(SignUp.this,Provider.Facebook);
}
By This code i get the access token in logcat but dont know how to store it.
you can go with most easiest way shared preferences .. or use session... where you can save and retrieve string with key value..
SessionManager.java
public class SessionManager {
// Shared Preferences
SharedPreferences pref;
// Editor for Shared preferences
Editor editor;
// Context
Context _context;
// Shared pref mode
int PRIVATE_MODE = 0;
// Sharedpref file name
private static final String PREF_NAME = "wlm";
// All Shared Preferences Keys
private static final String IS_LOGIN = "IsLoggedIn";
private static final String STATUS = "status";
private static final String STATUS_COLOR = "status_color";
// User name (make variable public to access from outside)
public static final String KEY_NAME = "name";
// Email address (make variable public to access from outside)
public static final String KEY_EMAIL = "email";
// Constructor
public SessionManager(Context context){
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
/**
* Create login session
* */
public void createLoginSession(String name, String email){
// Storing login value as TRUE
editor.putBoolean(IS_LOGIN, true);
// Storing name in pref
editor.putString(KEY_NAME, name);
// Storing email in pref
editor.putString(KEY_EMAIL, email);
// commit changes
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, LoginScreen.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_NAME, pref.getString(KEY_NAME, null));
// user email id
user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
// return user
return user;
}
/**
* Clear session details
* */
public void logoutUser(){
// Clearing all data from Shared Preferences
editor.clear();
editor.commit();
// After logout redirect user to Loing Activity
// Intent i = new Intent(_context, LoginScreen.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);
}
}
in you activity you can store you string with
session.editor.putInt("your key", YourString);
and retrieve with
String str = session.pref.getString("your key", "");
also define key for every entry in SessionManager like
private static final String ANY_NAME= "your key";
Acess token is stored in Session class
Session session = Session.getActiveSession();
String accessToken = session.getAccessToken();
can any one help me out I really need a solution, I have already search on SO, could not success !
I want to store auto generated user_id which I am receiving from server as a JSON response in my share preference and then again get from share preference to other activity and send as a parameter to server
Here is my login Activity where I am receiving unique user id in JSON response when sending username and pass to server
public void connect(String useremail, String userpassword) throws JSONException, IOException
{
RestClient1 client = new RestClient1(Constants.serverPath + Constants.loginMethod);
client.addParam("email", useremail);
client.addParam("password", userpassword);
client.addHeader("content-type", "application/json");
try
{
String response = client.executePost();
JSONObject jsonResponse = new JSONObject(response);
String jsonData = jsonResponse.getString("code");
String jData = jsonResponse.getString("ResponseStatus");
jsData = jData;
if (jsonData.equals("200"))
{
System.out.println("responseStatus =" + jData);
startActivity(new Intent(LoginMainActivity.this, DashBoardActivity.class));
finish();
}
In the "ResponseStatus" I am geting "Login Succsesfull , user_id=1" from server <**<< want to store this response on Share Preference**
My Basic Session Manager class which is not fully construct for storing response in JSON
public class SessionManager {
// Shared Preferences
SharedPreferences pref;
// Editor for Shared preferences
Editor editor;
// Context
Context _context;
// Shared pref mode
int PRIVATE_MODE = 0;
// Sharedpref file name
private static final String PREF_NAME = "Apppersonal";
// All Shared Preferences Keys
private static final String KEY_USERID = "user_id";
// public static final String KEY_FULLNAME = "fullName";
// public static final String KEY_EMAIL = "email";
// public static final String KEY_DOB = "dateofbirth";
// public static final String KEY_ADDRESS = "address";
// Constructor
public SessionManager(Context context){
this._context = context;
pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE);
editor = pref.edit();
}
public void createloginSession(int user_id)
{
// Storing id in pref
editor.putInt(KEY_USERID, user_id);
editor.commit();
}
public HashMap<String, String> getPersonalDetails() {
HashMap<String, String> userPersonal = new HashMap<String, String>();
userPersonal.put(KEY_FULLNAME, pref.getString(KEY_FULLNAME, null));
userPersonal.put(KEY_DOB, pref.getString(KEY_DOB, null));
userPersonal.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null));
userPersonal.put(KEY_ADDRESS, pref.getString(KEY_ADDRESS, null));
// return user
return userPersonal;
// TODO Auto-generated method stub
// return null;
}
// Clear session details
public void logoutUser(){
// Clearing all data from Shared Preferences
editor.clear();
editor.commit();
// After logout redirect user to Loing Activity
Intent i = new Intent(_context, LoginMainActivity.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);
}
}
After getting the user_id just do the following:
SessionManager mSessionManager = new SessionManager(context);
mSessionManager.createloginSession(user_id);
Put it after extending activity
SessionManager session;
And in your method put this
session.createLoginSession(json.getString(user_id));