Android第三方登錄(QQ、微信、微博、百度、facebook、twitter)框架,按需依賴方式

使用

  1. app的build.gradle裏添加配置如下,各平臺的SDK密鑰,按需添加,其中com.example.test修改爲你應用的包名。
buildTypes {
    debug {
        addManifestPlaceholders([packname: "com.example.test"])
        addManifestPlaceholders([tencent_appid: "1106841690"])
        addManifestPlaceholders([baidu_apikey: "u10rwmxIpFG8YTXYaGXSI6lV"])
        addManifestPlaceholders([weibo_appkey: "85283146", weibo_channel: "weibo"])
        addManifestPlaceholders([weixin_appid: "wxb174e4a70dc1779a", weixin_secret: "6e85eb9e5aabc5bd46d695b7cda66d08"])
        addManifestPlaceholders([twitter_apikey: "J20TVzE1VihlIt5Vr3XufK6pN", twitter_secret: "aiaym3F07GpRMsecMrjZ2ocmrI7T0TGXfmEqXebpWrUAciKG0v"])
        addManifestPlaceholders([facebook_appid: "1852628958197307"])
    }
    release {
        addManifestPlaceholders([packname: "com.example.test"])
        addManifestPlaceholders([tencent_appid: "1106841690"])
        addManifestPlaceholders([baidu_apikey: "u10rwmxIpFG8YTXYaGXSI6lV"])
        addManifestPlaceholders([weibo_appkey: "85283146", weibo_channel: "weibo"])
        addManifestPlaceholders([weixin_appid: "wxb174e4a70dc1779a", weixin_secret: "6e85eb9e5aabc5bd46d695b7cda66d08"])
        addManifestPlaceholders([twitter_apikey: "J20TVzE1VihlIt5Vr3XufK6pN", twitter_secret: "aiaym3F07GpRMsecMrjZ2ocmrI7T0TGXfmEqXebpWrUAciKG0v"])
        addManifestPlaceholders([facebook_appid: "1852628958197307"])
        ...
    }
}
  1. app的build.gradle中的添加依賴,自行修改爲最新版本,同步後通常就可以用了,login-3rdparty-core是必須的,其他的按需添加:
dependencies {
	...
	implementation 'com.github.wandersnail:login-3rdparty-core:1.0.0'
	implementation 'com.github.wandersnail:login-3rdparty-qq:1.0.0'
	implementation 'com.github.wandersnail:login-3rdparty-weixin:1.0.0'
	implementation 'com.github.wandersnail:login-3rdparty-weibo:1.0.0'
	implementation 'com.github.wandersnail:login-3rdparty-baidu:1.0.0'
	implementation 'com.github.wandersnail:login-3rdparty-twitter:1.0.0'
	implementation 'com.github.wandersnail:login-3rdparty-facebook:1.0.0'
}
  1. 如果從jcenter下載失敗。在project的build.gradle裏的repositories添加內容。
allprojects {
	repositories {
		...
		maven { url 'https://dl.bintray.com/wandersnail/android/' }
	}
}
  1. AndroidManifest.xml添加權限
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 用於調用 JNI -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
  1. 其他平臺以上就可以了,微信還需再添加一個文件:在你的包名相應目錄下新建一個wxapi目錄,並在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自WXEventActivity,內容不需要寫。如下圖:
    在這裏插入圖片描述

示例

class MainActivity : AppCompatActivity() {
    private var requester: PermissionsRequester? = null
    private var weixinLogin: WeixinLogin? = null
    private var qqLogin: QQLogin? = null
    private var weiboLogin: WeiboLogin? = null
    private var baiduLogin: BaiduLogin? = null
    private var twitterLogin: TwitterLogin? = null
    private var facebookLogin: FacebookLogin? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        requester = PermissionsRequester(this)
        val list = ArrayList<String>()
        list.add(Manifest.permission.WRITE_EXTERNAL_STORAGE)
        list.add(Manifest.permission.ACCESS_NETWORK_STATE)
        list.add(Manifest.permission.READ_PHONE_STATE)
        requester?.check(list)
        weixinLogin = WeixinLogin(this)
        qqLogin = QQLogin(this)
        weiboLogin = WeiboLogin(this)
        baiduLogin = BaiduLogin(this)
        twitterLogin = TwitterLogin(this)
        facebookLogin = FacebookLogin(this)
        btnWeixin.setOnClickListener {
            clearText()
            weixinLogin?.login(this, loginCallback)
        }
        btnQQ.setOnClickListener {
            clearText()
            qqLogin?.login(this, loginCallback)
        }
        btnWeibo.setOnClickListener {
            clearText()
            weiboLogin?.login(this, loginCallback)
        }
        btnBaidu.setOnClickListener {
            clearText()
            baiduLogin?.login(this, loginCallback)
        }
        btnTwitter.setOnClickListener {
            clearText()
            twitterLogin?.login(this, loginCallback)
        }
        btnFacebook.setOnClickListener {
            clearText()
            facebookLogin?.login(this, loginCallback)
        }
    }

    private fun clearText() {
        tv.text = ""
    }

    private val loginCallback = object : LoginCallback {
        override fun onSuccess(loginType: Int, info: UserInfo, origin: JSONObject) {
            val type = when (loginType) {
                BaseLogin.QQ -> "QQ"
                BaseLogin.WEI_XIN -> "微信"
                BaseLogin.WEI_BO -> "微博"
                BaseLogin.BAI_DU -> "百度"
                BaseLogin.TWITTER -> "Twitter"
                BaseLogin.FACEBOOK -> "Facebook"
                else -> ""
            }
            tv.append("類型: $type\n")
            tv.append("id: ${info.id}\n")
            tv.append("性別: ${info.gender}\n")
            tv.append("暱稱: ${info.nickname}\n")
            tv.append("所在地: ${info.location}\n")
            tv.append("頭像: ${info.figureUrl}\n\n")
            tv.append("原始數據\n")
            tv.append(origin.toString().replace(",", "\n"))
            if (!TextUtils.isEmpty(info.figureUrl)) {
                object : Thread() {
                    override fun run() {
                        val bitmap = ImageUtils.getNetBitmap(info.figureUrl)
                        runOnUiThread { iv.setImageBitmap(bitmap) }
                    }
                }.start()
            }
        }

        override fun onCancel() {
            tv.text = ""
            iv.setImageBitmap(null)
            ToastUtils.showShort("用戶取消")
        }

        override fun onError(errorCode: Int, errorDetail: String?) {
            tv.text = ""
            iv.setImageBitmap(null)
            ToastUtils.showShort(errorDetail)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        requester?.onActivityResult(requestCode, resultCode, data)
        qqLogin?.onActivityResult(requestCode, resultCode, data)
        weiboLogin?.onActivityResult(requestCode, resultCode, data)
        twitterLogin?.onActivityResult(requestCode, resultCode, data)
        facebookLogin?.onActivityResult(requestCode, resultCode, data)
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        requester?.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }

    override fun onDestroy() {
        super.onDestroy()
        qqLogin?.logout()
    }
}

關於平臺密鑰獲取

微信

https://open.weixin.qq.com創建移動應用,需要認證通過的開發者才能開通登錄權限。沒有開通登錄權限是無法調起授權頁面的。

QQ

http://open.qq.com/的應用管理裏創建應用即可,不需要提交審覈即可登錄授權。

微博

http://open.weibo.com/development/mobile接入應用,回調頁填寫:https://api.weibo.com/oauth2/default.html,也可以填寫自定義的,如果填寫了自定義的,在實例化WeiboLogin時需要使用傳入回調頁鏈接的構造方法。填寫完資料即可完成接入,不需要提交審覈即可測試登錄。

百度

http://developer.baidu.com/註冊帳號,右上角用戶名下拉菜單“應用管理”裏創建工程,創建後就有apikey,安全設置裏如果啓用了“Implicit Grant授權方式”,授權回調頁:必須填寫,內容填寫任意符合uri規則字符串即可。

Twitter

https://apps.twitter.com/註冊帳號並創建應用即可獲取。

Facebook

https://developers.facebook.com/註冊帳號並添加應用即可獲取。注意下:Facebook添加開發和發佈密鑰散列時,生成的不是28字符時,使用命令提示符,當時我用PowerShell死活沒生成成功,都是不到28字符的。

github查看源碼
碼雲查看源碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章