編輯:Android開發實例
網絡模塊的處理,基本上已講解完,後面若遇到其他的網絡處理需求再調整。這篇接著 實戰Android仿人人客戶端之人人授權訪問界面 繼續,前面聊到打開人人授權界面,當用戶輸入訪問人人的賬號和密碼,點擊“登錄”按鈕後,若成功服務器端會返回accessToken。之後怎麼處理,下面開始這篇的講述:
一、對服務器端返回的accessToken進行處理
服務器端會返回accessToken
- 195789%7C6.7faefec2274182195287028d00323781.2592000.1367118000-461345584
通過運行人人官方提供的Demo,打印LOG如下:
- 195789|6.7faefec2274182195287028d00323781.2592000.1367118000-461345584
需要做的處理:
- accessToken = accessToken.replace("%7C", "|");
二、用accessToken通過HTTP協議POST方式交換session_key、session_secret和userId。
1、發起網絡請求
- Map<String, String> parameter = new HashMap<String, String>();
- parameter.put("oauth_token", accessToken);
- AsyncBaseRequest asyncRequest = new AsyncHttpPost(Constant.SESSION_KEY_URL, parameter,
- new ParseCallback (){
- @Override
- public Boolean parse(String json) throws JSONException {
- Log.e(TAG, "result = " + json);
- return false;
- }
- },
- new ResultCallback(){
- @Override
- public void onSuccess(final Object result) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- }
- });
- }
- @Override
- public void onFail(int errorCode) {
- Log.e(TAG, "網絡請求返回的errorCode = " + errorCode);
- }
- });
- mDefaultThreadPool.execute(asyncRequest);
- mAsyncRequests.add(asyncRequest);
p#副標題#e#
2、解析網絡返回的JSON字符串:
服務器端返回的JSON字符串:
- {
- "renren_token":
- {
- "session_secret":"52e95c7b02abb0a80a4a80116438063a",
- "expires_in":2595334,
- "session_key":"6.8fed55fdfd5c027c2ecb0ac50859f97c.2592000.1367121600-461345584"
- },
- "oauth_token":"195789|6.8fed55fdfd5c027c2ecb0ac50859f97c.2592000.1367121600-461345584",
- "user":
- {
- "id":461345584
- }
- }
對JSON字符串進行解析:
- JSONObject jsonObject = new JSONObject(json);
- JSONObject jsonRenrenToken = jsonObject.getJSONObject("renren_token");
- String session_key = jsonRenrenToken.getString("session_key");
- String session_secret = jsonRenrenToken.getString("session_secret");
- long expires_in = jsonRenrenToken.getLong("expires_in");
- String oauth_token = jsonObject.getString("oauth_token");
- long userId = jsonObject.getJSONObject("user").getLong("id");
- // 對Session過期時間進行處理, Session過期時間 = 系統當前的時間 + 服務器端返回的Session過期時間。
- long create_session_time = System.currentTimeMillis();
- expires_in = create_session_time + expires_in*1000; // 服務器端返回的Session過期時間單位為秒,因此需要乘以1000
- StringBuilder authResult = new StringBuilder();
- authResult.append(" oauth_token = ").append(oauth_token);
- authResult.append("\n session_key = ").append(session_key);
- authResult.append("\n session_secret = ").append(session_secret);
- authResult.append("\n expires_in = ").append(expires_in);
- authResult.append("\n userId = ").append(userId);
- Log.i(TAG, "解析後的值:\n" + authResult.toString());
三、采用SharedPreferences在本地保存Auth授權的信息,以便以後使用。
- // 本地存儲Authorization授權認證數據
- Editor editor = mContext.getSharedPreferences("auth_config", Context.MODE_PRIVATE).edit();
- editor.putString("session_key", session_key);
- editor.putString("session_secret", session_secret);
- editor.putLong("expires_in", expires_in);
- editor.putLong("create_session_time", create_session_time);
- editor.putString("oauth_token", oauth_token);
- editor.putLong("userId", userId);
- editor.commit();
四、切換界面到應用主界面
- new ResultCallback(){
- @Override
- public void onSuccess(final Object result) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- if((Boolean)result)
- {
- Intent intent = new Intent(AuthActivity.this, EveryoneActivity.class);
- AuthActivity.this.startActivity(intent);
- } else {
- Log.e(TAG, "網絡請求返回的JSON值為NULL");
- }
- }
- });
- }
- @Override
- public void onFail(int errorCode) {
- Log.e(TAG, "網絡請求返回的errorCode = " + errorCode);
- }
- }
使用accessToken交換session等完整的代碼如下:
- /**
- * 通過accessToken換取session_key、session_secret和userId
- * @param accessToken
- */
- private void exchangeSessionKey(String accessToken) {
- if (accessToken == null || accessToken.length() < 1) {
- return;
- }
- Map<String, String> parameter = new HashMap<String, String>();
- parameter.put("oauth_token", accessToken);
- AsyncBaseRequest asyncRequest = new AsyncHttpPost(Constant.SESSION_KEY_URL, parameter,
- new ParseCallback (){
- @Override
- public Boolean parse(String json) throws JSONException {
- Log.e(TAG, "result = " + json);
- if(!TextUtils.isEmpty(json)){
- // 服務器端返回的JSON字符串:
- /*{
- "renren_token":
- {
- "session_secret":"52e95c7b02abb0a80a4a80116438063a",
- "expires_in":2595334,
- "session_key":"6.8fed55fdfd5c027c2ecb0ac50859f97c.2592000.1367121600-461345584"
- },
- "oauth_token":"195789|6.8fed55fdfd5c027c2ecb0ac50859f97c.2592000.1367121600-461345584",
- "user":
- {
- "id":461345584
- }
- }*/
- // 解析JSON
- JSONObject jsonObject = new JSONObject(json);
- JSONObject jsonRenrenToken = jsonObject.getJSONObject("renren_token");
- String session_key = jsonRenrenToken.getString("session_key");
- String session_secret = jsonRenrenToken.getString("session_secret");
- long expires_in = jsonRenrenToken.getLong("expires_in");
- String oauth_token = jsonObject.getString("oauth_token");
- long userId = jsonObject.getJSONObject("user").getLong("id");
- // 對Session過期時間進行處理, Session過期時間 = 系統當前的時間 + 服務器端返回的Session過期時間。
- long create_session_time = System.currentTimeMillis();
- expires_in = create_session_time + expires_in*1000; // 服務器端返回的Session過期時間單位為秒,因此需要乘以1000
- StringBuilder authResult = new StringBuilder();
- authResult.append(" oauth_token = ").append(oauth_token);
- authResult.append("\n session_key = ").append(session_key);
- authResult.append("\n session_secret = ").append(session_secret);
- authResult.append("\n expires_in = ").append(expires_in);
- authResult.append("\n userId = ").append(userId);
- Log.i(TAG, "解析後的值:\n" + authResult.toString());
- // 本地存儲Authorization授權認證數據
- Editor editor = mContext.getSharedPreferences("auth_config", Context.MODE_PRIVATE).edit();
- editor.putString("session_key", session_key);
- editor.putString("session_secret", session_secret);
- editor.putLong("expires_in", expires_in);
- editor.putLong("create_session_time", create_session_time);
- editor.putString("oauth_token", oauth_token);
- editor.putLong("userId", userId);
- editor.commit();
- return true;
- }
- return false;
- }
- },
- new ResultCallback(){
- @Override
- public void onSuccess(final Object result) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- if((Boolean)result)
- {
- Intent intent = new Intent(AuthActivity.this, EveryoneActivity.class);
- AuthActivity.this.startActivity(intent);
- } else {
- Log.e(TAG, "網絡請求返回的JSON值為NULL");
- }
- }
- });
- }
- @Override
- public void onFail(int errorCode) {
- Log.e(TAG, "網絡請求返回的errorCode = " + errorCode);
- }
- });
- mDefaultThreadPool.execute(asyncRequest);
- mAsyncRequests.add(asyncRequest);
- }
轉自:http://blog.csdn.net/android_ls/article/details/8741383
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
JSON代表JavaScript對象符號。它是一個獨立的數據交換格式,是XML的最佳替代品。本章介紹了如何解析JSON文件,並從中提取所需的信息。Android提供了四個
屏幕亮度自動調節:主要是從Sensor分析之中分離出來分析LIGHT 光線感應器,因此就分析一下自動調節屏幕亮度(手機隨著光線的強度自我調節,也就是在亮的光線下屏
Android應用程序可以在許多不同地區的許多設備上運行。為了使應用程序更具交互性,應用程序應該處理以適合應用程序將要使用的語言環境方面的文字,數字,文件等。在本章中,我