本系列文章將第三方的登入分享功能進行二次封裝,統一介面呼叫,簡化了接不同平臺登入分享的步驟。
0 系列文章
系列一 Android SDK的二次封裝和使用
系列二 原始碼解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入
1 前言
現在有市場上又好幾家都做了社會化分享元件,比如ShareSDK,Umeng等。唯一的缺點就是,必須得註冊相應服務平臺的賬號。無法單純使用客戶端SDK。
本系列文章即開源實現了社會化的登入分享,統一對外介面。會分別從如何使用、原始碼解析、各平臺接入進行解讀。
2 Github地址
先上開原始碼和封裝好的SDK。
歡迎在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。如下
5 功能介紹
該SDK主要整合了授權登入和分享的功能
5.1 授權登入
- 微信授權登入
- QQ授權登入
- 新浪微博授權登入
5.2 分享
5.2.1 分享媒介
- 文字
- 圖片
- 音樂
- 視訊
- 網頁
5.2.2 分享平臺
- 微信會話分享
- 微信朋友圈分享
- QQ分享
- QQ空間分享
- 新浪微博分享
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的基本原始碼解析。