社會化登入分享-Android SDK的二次封裝和使用

Tsy遠發表於2017-09-22

本系列文章將第三方的登入分享功能進行二次封裝,統一介面呼叫,簡化了接不同平臺登入分享的步驟。

0 系列文章

系列一 Android SDK的二次封裝和使用
系列二 原始碼解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入

1 前言

現在有市場上又好幾家都做了社會化分享元件,比如ShareSDK,Umeng等。唯一的缺點就是,必須得註冊相應服務平臺的賬號。無法單純使用客戶端SDK。

本系列文章即開源實現了社會化的登入分享,統一對外介面。會分別從如何使用、原始碼解析、各平臺接入進行解讀。

2 Github地址

先上開原始碼和封裝好的SDK。

github.com/tsy12321/So…

歡迎在issue裡提功能需求和建議!

3 目錄介紹

如圖:

目錄結構
目錄結構

採用了jar包的方式封裝sdk,需要使用時可以引入social_sdk.jar再搭配需要的平臺sdk使用.
這種方式可以減少sdk的體積,需要什麼平臺就引入哪個平臺.更為合理.

目錄結構:

  • app/ Demo程式碼
  • social_sdk/ sdk的開發原始碼module 開發完成後用gradle中makejar打成jar包
  • social_sdk_vxxx.jar sdk的jar包 直接使用.搭配所需的平臺sdk包.
  • weixin_sdk/ 微信sdk
  • qq_sdk/ qq sdk
  • sina_weibo_sdk/ 新浪微博 sdk

4 Demo介紹

替換Demo中的MainActivity中的qq appid、wx appid、weibo appkey為自己的

public class MainActivity extends AppCompatActivity implements IWeiboHandler.Response{

    ...

    private static final String WX_APPID = "your wx appid";    //申請的wx appid
    private static final String QQ_APPID = "your qq appid";    //申請的qq appid
    private static final String SINA_WB_APPKEY = "your sina wb appkey";       //申請的新浪微博 appkey

    ...
}複製程式碼

替換AndroidManifest中的qq appid為自己的

<!--qq-->
<activity
    android:name="com.tencent.tauth.AuthActivity"
    android:noHistory="true"
    android:launchMode="singleTask" >
    <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="tencent1111111" /> <!--1111111改為你的qq appid-->
    </intent-filter>
</activity>複製程式碼

替換builde.gradle檔案中的簽名為自己的app簽名。

修改完上面3個地方後即可跑通Demo。如下

Demo
Demo

5 功能介紹

該SDK主要整合了授權登入和分享的功能

5.1 授權登入

  1. 微信授權登入
  2. QQ授權登入
  3. 新浪微博授權登入

5.2 分享

5.2.1 分享媒介

  1. 文字
  2. 圖片
  3. 音樂
  4. 視訊
  5. 網頁

5.2.2 分享平臺

  1. 微信會話分享
  2. 微信朋友圈分享
  3. QQ分享
  4. QQ空間分享
  5. 新浪微博分享

6 開發說明

6.1 準備

將social_sdk.jar和需要的平臺sdk放入專案中引用.

AndroidManifest加上以下基本的許可權(之後各個平臺會註冊一些不同的資訊後面會說明)

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />複製程式碼

6.2 配置平臺資訊

在專案入口(或者在呼叫前)需要配置平臺的資訊,配置一次即可.

PlatformConfig.setWeixin(WX_APPID);
PlatformConfig.setQQ(QQ_APPID);
PlatformConfig.setSinaWB(SINA_WB_APPKEY);複製程式碼

6.3 介面使用說明

呼叫方式使用api呼叫登入或者分享介面,在引數中區別平臺,實現回撥接收成功 取消或者失敗的結果.

示例如下:(某些平臺會有一些特殊處理後面會在平臺中說明)

初始化api:

SocialApi mSocialApi = SocialApi.get(getApplicationContext());複製程式碼

登入授權:

mSocialApi.doOauthVerify(this, PlatformType.WEIXIN, new AuthListener() {
    @Override
    public void onComplete(PlatformType platform_type, Map<String, String> map) {
        Log.i("tsy", "oncomplete:" + map);
    }

    @Override
    public void onError(PlatformType platform_type, String err_msg) {
        Log.i("tsy", "onError:" + err_msg);
    }

    @Override
    public void onCancel(PlatformType platform_type) {
        Log.i("tsy", "onCancel");
    }
});複製程式碼

分享:


//分享媒介 後面有詳細介紹
ShareWebMedia shareMedia = new ShareWebMedia();
shareMedia.setTitle("分享網頁測試");
shareMedia.setDescription("分享網頁測試");
shareMedia.setWebPageUrl("http://www.baidu.com");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));

mSocialApi.doShare(this, PlatformType.WEIXIN, shareMedia, new ShareListener() {
    @Override
    public void onComplete(PlatformType platform_type) {
        Log.i("tsy", "share onComplete");
    }

    @Override
    public void onError(PlatformType platform_type, String err_msg) {
        Log.i("tsy", "share onError:" + err_msg);
    }

    @Override
    public void onCancel(PlatformType platform_type) {
        Log.i("tsy", "share onCancel");
    }
});複製程式碼

6.4 分享媒介

現在整合了文字分享,圖片分享,音樂分享,視訊分享,網頁分享5種分享媒介.不同的平臺可能只有其中某幾種.

6.4.1 文字分享

ShareTextMedia shareMedia = new ShareTextMedia();
shareMedia.setText("分享文字測試");複製程式碼

6.4.2 圖片分享

ShareImageMedia shareMedia = new ShareImageMedia();
shareMedia.setImage(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));複製程式碼

6.4.3 音樂分享

ShareMusicMedia shareMedia = new ShareMusicMedia();
shareMedia.setTitle("分享音樂測試");
shareMedia.setDescription("分享音樂測試");
shareMedia.setMusicUrl("http://idg-tangsiyuan.tunnel.nibaguai.com/splash/music.mp3");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));複製程式碼

6.4.4 視訊分享

ShareVideoMedia shareMedia = new ShareVideoMedia();
shareMedia.setTitle("分享視訊測試");
shareMedia.setDescription("分享視訊測試");
shareMedia.setVideoUrl("http://idg-tangsiyuan.tunnel.nibaguai.com/splash/music.mp3");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));複製程式碼

6.4.5 網頁分享

ShareWebMedia shareMedia = new ShareWebMedia();
shareMedia.setTitle("分享網頁測試");
shareMedia.setDescription("分享網頁測試");
shareMedia.setWebPageUrl("http://www.baidu.com");
shareMedia.setThumb(BitmapUtils.readBitMap(getApplicationContext(), R.mipmap.ic_launcher));複製程式碼

7 第三方平臺接入

7.1 微信

7.1.1 整合sdk

將目錄中的weixin_sdk_v3.1.1.jar放入專案.

7.1.2 配置

AndroidManifest中新增:

<activity
    android:name="com.tsy.sdk.social.weixin.WXCallbackActivity"
    android:configChanges="orientation|keyboardHidden|navigation|screenSize"
    android:exported="true"
    android:launchMode="singleTop"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<activity-alias
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:targetActivity="com.tsy.sdk.social.weixin.WXCallbackActivity" />複製程式碼

7.1.3 常量定義

設定配置資訊:

PlatformConfig.setWeixin(WX_APPID);複製程式碼

PlatformType:

微信:PlatformType.WEIXIN(可用於登入和微信回話分享)

朋友圈:PlatformType.WEIXIN_CIRCLE(用於微信朋友圈分享)

7.1.4 注意

使用微信登入分享需要簽名打包,並且簽名和包名要和微信平臺填入的資訊一致。

7.2 QQ

7.2.1 整合sdk

將目錄中的qq_mta-sdk-1.6.2.jar和qq_sdk_v3.1.0.jar放入專案.

7.2.2 配置

AndroidManifest中新增:

<!--qq-->
<activity
    android:name="com.tencent.tauth.AuthActivity"
    android:noHistory="true"
    android:launchMode="singleTask" >
    <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>
<activity
    android:name="com.tencent.connect.common.AssistActivity"
    android:screenOrientation="portrait"
    android:theme="@android:style/Theme.Translucent.NoTitleBar" />複製程式碼

7.2.3 常量定義

設定配置資訊:

PlatformConfig.setQQ(QQ_APPID);複製程式碼

PlatformType:

微信:PlatformType.QQ(可用於登入和QQ分享)

朋友圈:PlatformType.QZONE(用於qq控制元件分享)

7.2.4 注意

使用QQ登入需要簽名打包,並且簽名和包名要和QQ開放平臺填入的資訊一致。

7.3 新浪微博

7.3.1 整合sdk

將目錄中的weiboSDKCore_3.1.4.jar放入專案.

將所有so檔案統一放到專案的目錄app/jniLibs中(和libs同級), 然後在gradle中加上

android {

    ...

    //引入微博的所有so庫
    sourceSets {
        main {
            jniLibs.srcDirs = ['jniLibs']
        }
    }
}複製程式碼

7.3.2 配置

AndroidManifest中新增:

<activity
    android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
    android:configChanges="keyboardHidden|orientation"
    android:exported="false"
    android:windowSoftInputMode="adjustResize"></activity>複製程式碼

並且在發起分享的activity頁面的AndroidManifest頁面中加上

<activity android:name="com.tsy.girl.MainActivity">     <!--發起分享的頁面-->
    <intent-filter>
        <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>複製程式碼

然後在發起分享的Activity中新增以下程式碼.(假如是MainActivity)

實現IWeiboHandler.Response介面, 然後在實現的方法中寫:

@Override
public void onResponse(BaseResponse baseResponse) {
    ((SinaWBHandler)mSocialApi.getSSOHandler(PlatformType.SINA_WB)).onResponse(baseResponse);
}複製程式碼

實現onNewIntent和onActivityResult方法:

@Override
protected void onNewIntent(Intent intent) {
    ((SinaWBHandler)mSocialApi.getSSOHandler(PlatformType.SINA_WB)).onNewIntent(intent, this);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    mSocialApi.onActivityResult(requestCode, resultCode, data);
}複製程式碼

在onCreate中新增以下:

if (savedInstanceState != null) {
    ((SinaWBHandler)mSocialApi.getSSOHandler(PlatformType.SINA_WB)).onNewIntent(getIntent(), this);
}複製程式碼

然後正常發起授權或者分享程式碼即可.

7.3.3 常量定義

設定配置資訊:

PlatformConfig.setSinaWB(SINA_WB_APPKEY);複製程式碼

7.3.4 注意

使用新浪登入分享需要簽名打包,並且簽名和包名要和新浪平臺填入的資訊一致。

結尾

整個專案是一個可擴充套件的SDK,歡迎fork實現自己需要增加平臺的程式碼,這個庫本身也會不斷新增平臺和功能點。本篇就醬紫了,下篇會有整個SDK的基本原始碼解析。

相關文章