封装QQ、微信、微博的第三方登录和分享

10,855 阅读5分钟

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.