日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

AndroidQQ登录接入详细介绍(kotlin搭建)

發布時間:2023/12/14 Android 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AndroidQQ登录接入详细介绍(kotlin搭建) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

AndroidQQ登錄接入詳細介紹

    • 一、前言
    • 二、環境配置
        • 1.獲取應用ID
        • 2.官網下載相關的sdk
        • 3. jar的引入
        • 4.配置Manifest
    • 三、初始化配置
        • 1.初始化SDK
        • 2.創建實例
        • 3.開啟登錄
    • 四、接入流程以及相關代碼
        • 1.登錄之前檢查是否有token緩存
        • 2.進入登錄界面
        • 3.進入主activity
        • 4.獲取兩段重要的json數據
        • 5.踩坑系列
    • 五、總結

一、前言

由于之前自己項目的賬號系統不是非常完善,所以考慮接入QQ這個強大的第三方平臺的接入,目前項目暫時使用QQ登錄的接口進行前期的測試,這次從搭建到完善花了整整兩天時間,不得不吐槽一下QQ互聯的官方文檔,從界面就可以看出了,好幾年沒維修了,示例代碼也寫的不是很清楚,翻了好多源代碼和官方的demo,這個demo可以作為輔助參考,官方文檔的api失效了可以從里面找相應的替代,但它的代碼也太多了,一個demo 一萬行代碼,心累,當時把demo弄到可以運行就花了不少時間,很多api好像是失效了,筆者自己做了一些處理和完善,幾乎把sdk功能列表的登錄相關的api都嘗試了一下,真的相當的坑,正文即將開始,希望這篇文章能夠給后來者一些參考和幫助。

二、環境配置

1.獲取應用ID

這個比較簡單,直接到QQ互聯官網申請一個即可,官網地址

申請應用的時候需要注意應用名字不能出現違規詞匯,否則可能申請不通過

應用信息的填寫需要當前應用的包名和簽名,這個騰訊這邊提供了一個獲取包名和簽名的app供我們開發者使用,下載地址

未通過審核只能使用調試的QQ號進行登錄,通過就可以面向全部用戶了,以下為審核通過的圖片

2.官網下載相關的sdk

下載地址

推薦直接下載最新版本的,不過著實沒看懂最新版本的更新公告,說是修復了retrofit沖突的問題,然后當時新建的項目沒有用,結果報錯,最后還是加上了,才可以

3. jar的引入

將jar放入lib包下,然后在app 同級的 build.gradle添加以下代碼即完成jar的引用

dependencies {...implementation fileTree(dir: 'libs', include: '*.jar')... }

4.配置Manifest

在AndroidManifest.xml中的application結點下增加以下的activity和啟動QQ應用的聲明,這兩個activity無需我們在另外創建文件,引入的jar已經處理好了

<application... <!--這里的權限為開啟網絡訪問權限和獲取網絡狀態的權限,必須開啟,不然無法登錄--><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><activityandroid:name="com.tencent.tauth.AuthActivity"android:exported="true"android:launchMode="singleTask"android:noHistory="true"><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="tencent你的appId" /></intent-filter></activity><activityandroid:name="com.tencent.connect.common.AssistActivity"android:configChanges="orientation|keyboardHidden"android:screenOrientation="behind"android:theme="@android:style/Theme.Translucent.NoTitleBar" /><providerandroid:name="androidx.core.content.FileProvider"android:authorities="com.tencent.login.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider>...</application>

上面的哪個代碼的最后提供了一個provider用于訪問 QQ 應用的,需要另外創建一個 xml 文件,其中的 authorities 是自定義的名字,確保唯一即可,這邊最下面那個provider是翻demo找的,文檔沒有寫,在res文件夾中新增一個包xml,里面添加文件名為file_paths的 xml ,其內容如下

<?xml version="1.0" encoding="utf-8"?> <paths><external-files-path name="opensdk_external" path="Images/tmp"/><root-path name="opensdk_root" path=""/> </paths>

三、初始化配置

1.初始化SDK

加入以下代碼在創建登錄的那個activtiy下,不然無法拉起QQ應用的登錄界面,至于官方文檔所說的需要用戶選擇是否授權設備的信息的說明,這里通用的做法是在應用內部聲明一個第三方sdk的列表,然后在里面說明SDK用到的相關設備信息的權限

Tencent.setIsPermissionGranted(true, Build.MODEL)

2.創建實例

這部分建議放在全局配置,這樣可以實現登錄異常強制退出等功能

/*** 其中APP_ID是申請到的ID* context為全局context* Authorities為之前provider里面配置的值*/ val mTencent = Tencent.createInstance(APP_ID, context, Authorities)

3.開啟登錄

在開啟登錄之前需要自己創建一個 UIListener 用來監聽回調結果(文檔沒講怎么創建的,找了好久的demo)這里的代碼為基礎的代碼,比較容易實現,目前還沒寫回調相關的代碼,主要是為了快速展示效果

open class BaseUiListener(private val mTencent: Tencent) : DefaultUiListener() {private val kv = MMKV.defaultMMKV()override fun onComplete(response: Any?) {if (response == null) {"返回為空,登錄失敗".showToast()return}val jsonResponse = response as JSONObjectif (jsonResponse.length() == 0) {"返回為空,登錄失敗".showToast()return}"登錄成功".showToast()doComplete(response)}private fun doComplete(values: JSONObject?) {}override fun onError(e: UiError) {Log.e("fund", "onError: ${e.errorDetail}")}override fun onCancel() {"取消登錄".showToast()} }

建立一個按鈕用于監聽,這里進行登錄操作

button.setOnClickListener {if (!mTencent.isSessionValid) {//判斷會話是否有效when (mTencent.login(this, "all",iu)) {//下面為login可能返回的值的情況0 -> "正常登錄".showToast()1 -> "開始登錄".showToast()-1 -> "異常".showToast()2 -> "使用H5登陸或顯示下載頁面".showToast()else -> "出錯".showToast()}} }

這邊對mTencent.login(this, “all”,iu)中login的參數做一下解釋說明

mTencent.login(this, "all",iu) //這里Tencent的實例mTencent的login函數的三個參數 //1.為當前的context, //2.權限,可選項,一般選擇all即可,即全部的權限,不過目前好像也只有一個開放的權限了 //3.為UIlistener的實例對象

還差最后一步,獲取回調的結果的代碼,activity的回調,這邊顯示方法已經廢棄了,本來想改造一下的,后面發現要改造的話需要動sdk里面的源碼,有點麻煩就沒有改了,等更新

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)//騰訊QQ回調,這里的iu仍然是相關的UIlistenerTencent.onActivityResultData(requestCode, resultCode, data,iu)if (requestCode == Constants.REQUEST_API) {if (resultCode == Constants.REQUEST_LOGIN) {Tencent.handleResultData(data, iu)}} }

至此,已經可以正常登錄了,但還有一件我們開發者最關心的事情沒有做,獲取的用戶的數據在哪呢?可以獲取QQ號嗎?下面將為大家解答這方面的疑惑。

四、接入流程以及相關代碼

首先回答一下上面提出的問題,可以獲得兩段比較關鍵的json數據,一個是 login 的時候獲取的,主要是token相關的數據,還有一段就是用戶的個人信息的 json 數據,這些都在 UIListener 中進行處理和獲取。第二個問題能不能獲取QQ號,答案是不能,我們只能獲取與一個與QQ號一樣具有唯一標志的id即open_id,顯然這是出于用戶的隱私安全考慮的,接下來簡述一下具體的登錄流程

1.登錄之前檢查是否有token緩存

  • 有,直接啟動主activity
  • 無,進入登錄界面

判斷是否具有登錄數據的緩存

//這里采用微信的MMKV進行儲存鍵值數據 MMKV.initialize(this) val kv = MMKV.defaultMMKV() kv.decodeString("qq_login")?.let{val gson = Gson()val qqLogin = gson.fromJson(it, QQLogin::class.java)QQLoginTestApplication.mTencent.setAccessToken(qqLogin.access_token,qqLogin.expires_in.toString())QQLoginTestApplication.mTencent.openId = qqLogin.openid }

檢查token和open_id是否有效和token是否過期,這里采取不同于官方的推薦的用法,主要是api失效了或者是自己沒用對方法,總之官方提供的api進行緩存還不如MMKV鍵值存login json來的實在,也很方便,這里建議多多使用日志,方便排查錯誤

//這里對于uiListener進行了重寫,object的作用有點像java里面的匿名類 //用到了checkLogin的方法 mTencent.checkLogin(object : DefaultUiListener() {override fun onComplete(response: Any) {val jsonResp = response as JSONObjectif (jsonResp.optInt("ret", -1) == 0) {val jsonObject: String? = kv.decodeString("qq_login")if (jsonObject == null) {"登錄失敗".showToast()} else {//啟動主activity}} else {"登錄已過期,請重新登錄".showToast()//啟動登錄activity}}override fun onError(e: UiError) {"登錄已過期,請重新登錄".showToast()//啟動登錄activity}override fun onCancel() {"取消登錄".showToast()} })

2.進入登錄界面

在判斷session有效的情況下,進入登錄界面,對login登錄可能出現的返回碼做一下解釋說明

Login.setOnClickListener {if (!QQLoginTestApplication.mTencent.isSessionValid) {when (QQLoginTestApplication.mTencent.login(this, "all",iu)) {0 -> "正常登錄".showToast()1 -> "開始登錄".showToast()-1 -> {"異常".showToast()QQLoginTestApplication.mTencent.logout(QQLoginTestApplication.context)}2 -> "使用H5登陸或顯示下載頁面".showToast()else -> "出錯".showToast()}} }
  • 1:正常登錄

    這個就無需做處理了,直接在回調那里做相關的登錄處理即可

  • 0:開始登錄

    同正常登錄

  • -1:異常登錄

    這個需要做一點處理,當時第一次遇到這個情況就是主activity異常消耗退回登錄的activity,此時在此點擊登錄界面的按鈕導致了異常情況的出現,不過這個處理起來還是比較容易的,執行強制下線操作即可

    "異常".showToast() mTencent.logout(QQLoginTestApplication.context)
  • 2:使用H5登陸或顯示下載頁面

    通常情況下是未安裝QQ等軟件導致的,這種情況無需處理,SDK自動封裝好了,這種情況會自動跳轉QQ下載界面

同樣的有出現UIListener就需要調用回調進行數據的傳輸

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {super.onActivityResult(requestCode, resultCode, data)//騰訊QQ回調Tencent.onActivityResultData(requestCode, resultCode, data,iu)if (requestCode == Constants.REQUEST_API) {if (resultCode == Constants.REQUEST_LOGIN) {Tencent.handleResultData(data, iu)}} }

3.進入主activity

這里需要放置一個按鈕執行下線操作,方便調試,同時這里需要將之前的token移除重新獲取token等數據的緩存

button.setOnClickListener {mTencent.logout(this)val kv = MMKV.defaultMMKV()kv.remove("qq_login")//返回登錄界面的相關操作"退出登錄成功".showToast() }

至此,其實還有一個很重要的東西沒有說明,那就是token數據的緩存和個人信息數據的獲取,這部分我寫的登錄的那個UIlistener里面了,登錄成功的同時,獲取login的response的json數據和個人信息的json數據

4.獲取兩段重要的json數據

  • login 的json數據

    這個比較容易,當我們登錄成功的時候,oncomplete里面的response即我們想要的數據

    override fun onComplete(response: Any?) {if (response == null) {"返回為空,登錄失敗".showToast()return}val jsonResponse = response as JSONObjectif (jsonResponse.length() == 0) {"返回為空,登錄失敗".showToast()return}//這個即利用MMKV進行緩存json數據kv.encode("qq_login",response.toString())"登錄成功".showToast() }
  • 個人信息的數據

    這個需要在login有效的前提下才能返回正常的數據

    //首先需要用上一步獲取的json數據對mTencent進行賦值,這部分放在doComplete方法中執行 private fun doComplete(values: JSONObject?) {//利用Gson進行格式化成對象val gson = Gson()val qqLogin = gson.fromJson(values.toString(), QQLogin::class.java)mTencent.setAccessToken(qqLogin.access_token, qqLogin.expires_in.toString())mTencent.openId = qqLogin.openidLog.e("fund",values.toString()) }

    創建一個get_info方法進行獲取,注意這里需要對mTencent設置相關的屬性才能獲取正常獲取數據

    private fun getQQInfo(){val qqToken = mTencent.qqToken//這里的UserInfo是sdk自帶的類,傳入上下文和token即可val info = UserInfo(context,qqToken)info.getUserInfo(object :BaseUiListener(mTencent){override fun onComplete(response: Any?){//這里對數據進行緩存kv.encode("qq_info",response.toString()) }}) }

5.踩坑系列

這里主要吐槽一下關于騰訊的自帶的session緩存機制,當時是抱著不用自己實現緩存直接用現成的機制去看的,很遺憾這波偷懶失敗,這部分session的設置不知道具體的緩存機制,只知道大概是用share preference實現的,里面有saveSession,initSession,loadSession這三個方法,看上去很容易的樣子,然后抱著這種心態去嘗試了一波,果然不出意外空指針異常,嘗試修改了一波回調的順序仍然空指針異常,折騰了大概三個多小時,放棄了,心態給搞崩了,最終釋然了,為什么要用騰訊提供的方法,這個緩存自己實現也是相當的容易,這時想到了MMKV,兩行代碼完成讀取,最后只修改了少數的代碼完成了登錄的token的緩存機制,翻看demo里面的實現,里面好像是用這三種方法進行實現的,可能是某個實現機制沒有弄明白,其實也不想明白,自己的思路比再去看demo容易多了,只是多了一個json的轉對象的過程,其他的沒有差別。所以建議后來者直接自己實現緩存,不用管sdk提供的那些方法,真的有點難用。

五、總結

總之這次完成QQ接入踩了許多的坑,不過幸好最終還是實現了,希望騰訊互聯這個sdk能夠上傳github讓更多的人參與和提供反饋,不然這個文檔說是最差sdk體驗也不為過。下面附上這次實現QQ登錄的demo的github地址以及相關的demo apk供大家進行參考,大概總共就400行代碼左右比官方的demo好很多,有問題歡迎留言
個人github demo

總結

以上是生活随笔為你收集整理的AndroidQQ登录接入详细介绍(kotlin搭建)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。