封裝QQ、微信、微博的第三方登入和分享

arvinljw發表於2019-03-04

SocialHelper

目前幾乎所有app都包含了第三方的登入以及分享功能,之前大多都使用ShareSDK或者其他SDK來實現,但是有些情況不希望通過第三方的sdk來間接整合,所以這個元件就有了用武之地。

這個元件在demo中是沒有包含相關呼叫的程式碼的只有一些配置和使用的東西,因為應用的申請實在麻煩,但是已經在專案中測試通過了,所以可以放心使用。

專案地址

優點

  • 便捷實現第三方登入和分享及其回撥
  • 瞭解第三方登入或分享的實現流程

用法

包含了:如何引用、使用以及混淆

引用

1、在根目錄的build.gradle中加入如下配置

allprojects {
    repositories {
        ...
        maven { url `https://jitpack.io` }
        maven { url "https://dl.bintray.com/thelasterstar/maven/" }
    }
}
複製程式碼

2、在要是用的module中增加如下引用

dependencies {
    ...
    compile `com.github.arvinljw:SocialHelper:v1.0.4`
}
複製程式碼

注:如果在該module中使用了v7包,那麼可使用exclude命令移除本庫的引用避免重複,gson也是一樣,大體方法如下

compile (`com.github.arvinljw:SocialHelper:v1.0.4`){
    exclude group: `com.android.support`
}
複製程式碼

使用

1、相應配置

AndroidManifest.xml配置

新增許可權

<!--微信許可權,微博許可權,qq只需前兩個-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
複製程式碼

在application下新增Activity

<!--qq配置開始-->
<activity
    android:name="com.tencent.tauth.AuthActivity"
    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="tencentqqAppId"/>
    </intent-filter>
</activity>
<activity
    android:name="com.tencent.connect.common.AssistActivity"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
<!--qq配置結束-->
<!--微信配置開始-->
<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:label="@string/app_name"
    />
<!--微信配置結束-->

<!--微博不需要-->
複製程式碼

注:其中需要注意的是,qq配置中
qqAppId換成您申請的qqAppId即可

微信還需要在packageName.wxapi的包下建立WXEntryActivity,具體實現可在這裡檢視

拷貝過去即可,注意路徑,其中主要的處理是在其onResp的時候判斷是登入還是分享做出相應的處理,通知本庫觸發回撥

2、獲取例項

首先採用外觀模式,暴露出來一個SocialHelper,可以通過構建者模式獲取例項,呼叫相關方法,配置回撥。

socialHelper = new SocialHelper.Builder()
        .setQqAppId("qqAppId")
        .setWxAppId("wxAppId")
        .setWxAppSecret("wxAppSecret")
        .setWbAppId("wbAppKey")
        .setWbRedirectUrl("wbRedirectUrl")
        .build();
複製程式碼

3、呼叫相關方法

這裡提供了QQ、微信和微博的相應的登入和分享方法

  • public void loginQQ(Activity activity, SocialLoginCallback callback)
  • public void loginWX(Activity activity, SocialLoginCallback callback)
  • public void loginWB(Activity activity, SocialLoginCallback callback)
  • public void shareQQ(Activity activity, SocialShareCallback callback, ShareEntity shareInfo)
  • public void shareWX(Activity activity, SocialShareCallback callback, ShareEntity shareInfo)
  • public void shareWB(Activity activity, SocialShareCallback callback, ShareEntity shareInfo)

這個其實通過名字就能知道是什麼意思,就不解釋了,需要解釋的是引數:

a、傳入的Activity

主要是為了回撥回來都在當前Activity中處理回撥事情,避免在Fragment中去處理,這樣也能減少一些工作

注:當然遇到在Fragment中呼叫登入或者分享的時候,請使用您最熟悉的方式回撥到其Activity中處理相關操作

b、傳入的回撥

這裡回撥也分為了兩種登入回撥和分享回撥

回撥介面如下:

public interface SocialCallback {
    void socialError(String msg);
}

public interface SocialLoginCallback extends SocialCallback{
    void loginSuccess(ThirdInfoEntity info);
}

public interface SocialShareCallback extends SocialCallback{
    void shareSuccess();
}
複製程式碼

登入和分享回撥失敗都會有一個資訊返回;

登入成功會將封裝的第三方資訊返回,包含了常用的暱稱,性別,頭像,登入平臺,更多資訊也能在其中找到,詳細的含義在Lib中有詳細的註釋;

分享成功就只有一個回撥,便於提示。

c、ShareEntity

這個引數是分享的重點,對於QQ、微信和微博對應著QQShareEntity、WXShareEntity以及WBShareEntity

都可以通過其相應的靜態方法建立相應分享型別

  • QQShareEntity

    • createImageTextInfo 圖文資訊,網頁資訊
    • createImageInfo 純圖片資訊
    • createMusicInfo 音樂資訊
    • createAppInfo 應用資訊
    • createImageTextInfoToQZone 圖文資訊到QQ空間
  • WXShareEntity

    • createTextInfo 文字資訊
    • createImageInfo 純圖片資訊
    • createMusicInfo 音樂資訊
    • createVideoInfo 視訊資訊
    • createWebPageInfo 網頁資訊
  • WBShareEntity

    • createTextInfo 純文字資訊
    • createImageTextInfo 圖文資訊
    • createMultiImageInfo 多圖資訊
    • createVideoInfo 視訊資訊
    • createWebInfo 網頁資訊

具體詳細的引數以及註釋在相應類中都有明確的註釋,這裡就不過多的展開了;其中有ParamsRequired註解的引數代表必傳。

注意,有些不必傳的引數,不傳雖然也能分享成功,但是有可能會影響分享出去的樣式,請自行除錯。

4、回撥配置

在呼叫的Activity中配置

//用處:qq登入和分享回撥,以及微博登入回撥
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null && socialHelper != null) {//qq分享如果選擇留在qq,通過home鍵退出,再進入app則不會有回撥
        socialHelper.onActivityResult(requestCode, resultCode, data);
    }
}
//用處:微博分享回撥
@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    if (socialHelper != null) {
        socialHelper.onNewIntent(intent);
    }
}
複製程式碼

至於微信的回撥配置,在一開始的時候說的WXEntryActivity的onResp中的處理就是了。

至此使用方式就基本完畢,算下來也就這麼四部配置,就能愉快的使用了,當然前提是相應的app申請已經成功。

其中對於SocialHelper的例項,可以像Demo中一樣使用一個工具簡單封裝成單例來使用。

混淆

#qq
-keep class com.tencent.**{*;}
#微博
-keep class com.sina.weibo.sdk.** { *; }
#微信
-keep class com.tencent.mm.opensdk.** { *; }
-keep class packageName.wxapi.** { *; }
#Gson
-keep class com.google.gson.** {*;}
-keep class com.google.**{*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
#Socialhelper
-keep class net.arvin.socialhelper.**{*;}
複製程式碼

注:微信的packageName換成自己的包名

三方文件連結

QQ平臺

微信平臺

微博平臺

反饋

若是有什麼好的建議或者問題,請多多指教,感激不盡。

待做事項

  • 引數解釋以及對應樣式的整理
  • 整理三方登入分享流程圖
  • 完善demo的程式碼

License

Copyright 2017 arvinljw

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
複製程式碼

相關文章