編輯:關於Android編程
今天工作中遇到的一個問題,需求是這樣的,需要給dz的論壇做一個android擴展,這肯定少不了會員登錄,就得需要二次開發dz提供一個登錄接口,眩暈中。。。
因為我對dz不熟悉,所以這個工作對我來說還是有難度的。
仔細分析了一下,在android上為什麼需要客戶端登錄? 答案是肯定的,就是為了獲取能唯一標識該用戶的信息——uid,其實登錄的目的就是這麼單純(提供接口不也是給客戶端一個uid嘛)。
那既然只是為了獲取一個uid,我們應該還有其他的方式獲取,首先就想到了用WEB登錄的方式,因為dz已經提供了WAP模塊,所以完全可以在應用內以WebView展示一個登錄界面讓用戶登錄。
那問題來了, 用戶登錄後我們怎麼獲取他的uid呢? 畢竟不是在我們的代碼中登錄的。。。
反復搜索,終於找到了一個叫:CookieManager的東西,這個類可以獲取WebView中的cookie,那我們直接從cookie中獲取uid不就ok了?
懷著激動的心情,打開chrome的debug,不斷登錄...退出...就是為了找到uid的身影,當然結果是令人失望的。
vcyjrLrcv+yjrNXiuPbOxLz+09DBy6O6L3NvdXJjZS9jbGFzcy9jbGFzc19tZW1iZXIucGhwo6y+zcrH1eK49s7EvP7W0LSmwO21xLXHwryjrLTyv6q/tNK7z8KjrLrcs6SjrLWrysfT0Lj2t723qNL9xvDBy87StcTXotLio7pmdW5jdGlvbiBvbl9sb2dpbigpCiCjrCDX9mFuZHJvaWS1xNOmuMPSuyYjMzA1MjQ7vs2/tLP2wLTBy6Os1eLKx7XHwry1xKGwu9i196Gxo6zXotLiu9i1987SvNPS/brFwcujrLWrysfQoc+4vdrO0sPHsrvTw7nY0MSjrNfu1vfSqrXEo6zO0sPHwvWz9sHL0ru087K9o6y8zND45K/AwLT6wuujrM7St6LP1s7Su7nKx7rc0NLUy7XEo6y63L/s1Nq089S8Mjc10NC1xM671sOjrM7St6LP1sHL0ru2zmpztPrC66OszqrKssO01eK2zmpztPrC67vh0v3G8M7StcTXotLixNijvyDE47+0v7S+zdaqtcDBy6O6"setTimeout("window.location.href =\''.$href.'\';", 3000);' 大家都知道,在dz中登錄成功會用一個幾秒中的等待然後跳轉的,找到這段代碼太令人興奮了,那就在這段代碼的前後找找,看看有沒有位置設置咱們的cookie。
往上看代碼,又一個興奮點來了:if(defined('IN_MOBILE')) 這難道就是區分手機和PC登錄的?,二話不說在這裡面設置uid的cookie試試:dsetcookie('uid', $_G['uid']); 唉? 怎麼和PHP設置cookie的函數不一樣? 當你看這個源文件的時候,你會發現很多dsetcookie的代碼,這肯定是dz對setcookie的一次封裝,咱們直接copy用就ok了,還有一個$_G['uid']也是在這個文件中發現的,我猜測它就是用戶的uid了。
趕緊測試一下,好吧。。。在cookie中沒有發現uid的身影。。那把設置cookie的這句話網上放放。代碼往上走又是一個if語句,這次我直接跳過這個if,直接在if的上面停放了dsetcookie('uid', $_G['uid']); 這句話,繼續跟進測試,這次終於在cookie中多了一項,而且,正好,該項是以uid結尾的:
小小激動一下,現在咱們完全可以在cookie中獲取uid的值了。
接下來就是android客戶端的任務了, 肯定就是一個webview加載dz的登錄界面了,這個就不說了,來看看cookie是怎麼處理的。
在WebViewClient的onPageFinished方法中:
CookieManager cookieManager = CookieManager.getInstance(); String cookies = cookieManager.getCookie(url); if (null != cookies) { parseUid(cookies); }第一行,我們通過CookieManager的靜態方法獲取CookieManager實例,緊接著第二行中通過getCookie(String url)方法,獲取改url上的cookie,是不是很方便?
在if中調用了一個parseUid的方法,很明顯,我們要去取其中的uid了,跟進去看看:
private void parseUid(String cookies) { String[] cookieKeyValues = cookies.split(";"); for(String cookieItem : cookieKeyValues) { if(cookieItem.trim().startsWith("XXX_XXXX_uid")) { String uid = cookieItem.split("=")[1]; System.out.println("uid = " + uid); SharedPreferences.Editor editor = getSharedPreferences( Constants.CONFIG, Context.MODE_PRIVATE).edit(); editor.putBoolean(Constants.IS_LOGIN, true); editor.putInt(Constants.UID, Integer.parseInt(uid)); editor.commit(); finish(); } } }在這個方法中,首先我們用;分割出每一條cookie,因為我發現,多個cookie都是以;分割的,接下來一個遍歷,找到以咱們關心的那個cookie的key開頭的,然後繼續用=分割,因為在字符串中cookie是以key=value的形式存在的。至此,咱們需要的uid就找到了,接下來的幾行代碼就是寫入到本地了,不多說了。
總結:
有時候,一些看似復雜的事情,完全可以用很簡單的方式去實現,不過,這需要我們轉變一下思路,從另一個思路去思考問題。
當然,上面這種做法肯定有不完美的地方,而且這種方法對於熟悉dz的人來說完全沒有必要,但結果還算可以,畢竟給我們省下來很多代碼,服務器僅用了一行代碼,客戶端也區區不到20行的代碼就搞定了。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedIn
1.下拉列表Spinner 1.1.activity_main.xml Spinner是下拉列表的
小米手環2和唯樂now2哪個好?小米手環2准備開放購買了,小編了解到,還有一款唯樂now2可以選擇,如果買不到小米手環2的網友,也可以考慮唯樂手環,那麼小米
什麼是AIDL以及如何使用 ①aidl是Android interface definition Language 的英文縮寫,意思Android 接口定義語言。 ②使用