2017-02-17 163 views
0

我無法將訪問令牌,用戶名存儲在SharedPreferences.How這可以完成嗎?在Android本地存儲中存儲訪問令牌?

登錄類

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(); 
} 

}

SessionManagement類

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); 
    } 

} 

如何SessionManagement類在登錄類可用於本地存儲的信息?

+0

你到目前爲止嘗試了什麼?你面臨的問題是什麼? –

+0

我已經創建的會話管理類,以及不知道如何使用它登錄類 – seon

+0

創建'SessionManagement'類的一個對象,並在必要時調用相應的方法。 –

回答

2

試試這個,

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); 
} 
+0

問題沒有解決。 – seon

+0

您的createLoginSession是否調用。?在createLoginSession中添加日誌並打印所有值並檢查您是否獲得所有值 – user2025187

+0

我已編輯createLoginSession函數按原樣使用並檢查日誌值在logcat中傳遞用戶名和user_name_new – user2025187

1

您可以使用共同的偏好來保存登錄信息/訪問令牌。請通過代碼片段。

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); 
}} 

同樣,您可以將用戶名和密碼存儲到共享的首選項並根據需要檢索它們。

+0

在Login類中實例化這個類的位置? – seon

+0

您不必實例化類,因爲方法是靜態的,您可以直接訪問。登錄API成功後,可以保存來自服務器的令牌和用戶名/密碼。 –

+0

我必須在登錄類中使用Preferences類。 – seon

0

請按照以下步驟在本地存儲中保存任何類型的數據將完美工作,因爲這是我的應用程序的代碼。

  1. 在你的應用程序類首先創建應用程序的靜態實例。並且在這個應用程序類中創建PreferenceManager類的靜態實例,其中所有操作都將完成。
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; 
} 

} 
  • 現在你MyPreferenceManager類的代碼:
  • 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(); 
    
    } 
    
    } 
    
  • 現在,您可以從下面的代碼中將數據保存到本地存儲。
  • MyApp.getInstance().getPreferenceManager().putString(MyPreferenceManager.KEY_ID, "1"); 
    MyApp.getInstance().getPreferenceManager().putString(MyPreferenceManager.KEY_ACCESS_TOKEN, "oihfodfdshfhfoifhoifh3393"); 
    
  • 現在,從任何地方可以從下面這一代碼獲得從本地存儲的數據。
  • String id = MyApp.getInstance().getPreferenceManager().getString(MyPreferenceManager.KEY_ID); 
    String accessToken = MyApp.getInstance().getPreferenceManager().getString(MyPreferenceManager.KEY_ACCESS_TOKEN); 
    

    感謝。