Android使用ShareSDK集成第三方登录和分享(v3.1.2)

一.产品概述

ShareSDK是一种社会化分享组件,为iOS、Android、WP8 的APP提供社会化功能,集成了一些常用的类库和接口,缩短开发者的开发时间,还有社会化统计分析管理后台。

二.集成方式

1.Maven集成

使用ShareSDK maven集成方式,不需要在AndroidMainfest.xml下面配置任何权限和Activity
(1)打开项目根目录的gradle.build,在buildscrip>repositories的方法下面添加maven库的路径引用

maven {
    url "http://mvn.mob.com/android"
}

(2)在gradle.build下面的dependencies依赖模块下面添加MobSDK的依赖

dependencies {
   ...
    classpath 'com.mob.sdk:MobSDK:+'
}

(3)、在使用到Mob产品的module下面的build.gradle文件里面添加引用

apply plugin: 'com.android.application'
apply plugin: ‘com.mob.sdk’

(4).然后添加MobSDK方法,配置mob的key和秘钥
Onekeyshare是ShareSDK的GUI界面,如果不需要,则需要添加”gui false”,因为默认是使用gui,version字段为SDK的版本号,不设置则使用最新的版本;

MobSDK {
    appKey "d580ad56b4b5"
    appSecret "7fcae59a62342e7e2759e9e397c82bdd"

    ShareSDK {}

}

(5)、maven集成方式可以在Mob产品的module下面的build.gradle文件里面配置ShareSDK各个社交平台的key信息

MobSDK {
    appKey "d580ad56b4b5"
    appSecret "7fcae59a62342e7e2759e9e397c82bdd"

    ShareSDK {
        //平台配置信息
        devInfo {
            SinaWeibo {
                appKey "568898243"
                appSecret "38a4f8204cc784f81f9f0daaf31e02e3"
                callbackUri "http://www.sharesdk.cn"
                shareByAppClient false
            }
            Wechat {
                appId "wx4868b35061f87885"
                appSecret "64020361b8ec4c99936c0e3999a9f249"
            }
            QQ {
                appId "100371282"
                appKey "aed9b0303e3ed1e27bae87c33761161d"
            }
            Facebook {
                appKey "1412473428822331"
                appSecret "a42f4f3f867dc947b9ed6020c2e93558"
                callbackUri "https://mob.com"
            }
        }
    }

}

其中的devInfo为来自社交平台的应用信息。

(6).初始化MobSDK

如果您没有在AndroidManifest中设置appliaction的类名,MobSDK会将这个设置为com.mob.MobApplication,但如果您设置了,请在您自己的Application类中调用

MobSDK.init(this);

2.下载sdk

注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包

sdk下载地址

http://www.mob.com/downloadDetail/ShareSDK/android

下载sdk后快速生成项目,把生成的资源复制到项目中

添加权限

<!-- 添加必要的权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.GET_TASKS" />
<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.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<!-- 短信验证登陆功能需要添加次权限来自动填充验证码,用不到可以去掉 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />


在清单文件AndroidManifest.xml添加activity信息

  <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <meta-data
            android:name="Mob-AppKey"
            android:value="239d49dc33750"/>
        <meta-data
            android:name="Mob-AppSecret"
            android:value="7dd2be46765063ee764e7011ccceeb84"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity android:name=".LoginActivity">
        </activity>
        <activity
            android:name="com.mob.tools.MobUIShell"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
            android:windowSoftInputMode="stateHidden|adjustResize">

            <!--
                AuthorizeAdapter表示一个继承自cn.sharesdk.framework.authorize.AuthorizeAdapter
                的类,这个类可以监听到页面的生命周期,也可以获取授权页面的各种UI控件。
                开发者可以通过继承AuthorizeAdapter,重写其方法,并获取各种UI来自定义这个页面的行为。
            -->
            <meta-data
                android:name="AuthorizeAdapter"
                android:value="cn.sharesdk.demo.MyAdapter"/>

            <!--
                QZoneWebShareAdapter表示一个继承自cn.sharesdk.tencent.qzone.QZoneWebShareAdapter
                的类,这个类可以监听到页面的生命周期,也可以获QQ空间网页分享权页面的各种UI控件。
                开发者可以通过继承QZoneWebShareAdapter,重写其方法,并获取各种UI来自定义这个页面的行为。
            <meta-data android:name="QZoneWebShareAdapter" android:value="cn.sharesdk.demo.MyQZoneWebShareAdapter" />
            <meta-data android:name="QQWebShareAdapter" android:value="cn.sharesdk.demo.MyQQWebShareAdapter" />
            -->


            <!--
                Dropbox的SSO功能需要在此处添加一个对ACTION_VIEW事件的过滤器,其中的scheme是
                “db-”前缀再开发者应用的加上appKey。如果此过滤器不设置,则不能完成SSO功能授权
            -->
            <intent-filter>
                <data android:scheme="db-7janx53ilz11gbs"/>

                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.BROWSABLE"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

            <!--
                如果集成QQ分享,或者使用QQ客户端来进行QQ空间的分享,须要在此处添加一个对ACTION_VIEW
                事件的过滤器,其中的scheme是“tencent”前缀再开发者应用的加上appId。如果此过滤器不设置,
                则分享结束以后不能得到正确的回调
            -->
            <intent-filter>
                <data android:scheme="tencent100371282"/>

                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>

            <!-- 调用新浪原生SDK,需要注册的回调activity -->
            <intent-filter>
                <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/>

                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

            <!-- 集成Line客户端登录授权,需要添加如下格式的过滤器 -->
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.VIEW"/>

                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>

                <data android:scheme="line.1477692153"/>
            </intent-filter>
        </activity>
        <!-- 微信分享回调 -->
        <activity
            android:name=".wxapi.WXEntryActivity"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
    </application>

第三方登录

   所谓的第三方登录,就是利用用户在第三方平台上已有的账号来快速完成自己应用的登录或者注册的功能。而这里的第三方平台,一般是已经有大量用户的平台,如国内的新浪微博、QQ空间,微信,外国的Facebook、twitter等等。第三方登录不是一个具体的接口,而是一种思想或者一套步骤。

选择好平台以后,现在思考下面的问题:

你的应用是否具备独立账户系统?
这个问题是第三方登录时接口选择的重要标准。如果你选择“是”,则意味着你的应用只是需要第三方平台的用户,而不是他们的账户验证功能——也就是“要数据,不要功能”。而如果你选择“否”,则表示你实际上是’“要功能,不要数据(用户)”’。对于ShareSDK来说,前者你的入口方法是showUser(null),而后者是authorize()。那么下面我分情况解释两种接入方式的步骤。
package com.example.administrator.sharesdk_312;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

import java.util.HashMap;

import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.wechat.friends.Wechat;

/**
 * ShareSDK第三方登录
 * 1.手动授权
 * 2.自动授权
 * 3.SSO授权:就是利用这些平台的手机客户端来完成授权。由于SSO的授权方式对于用户来说更加便捷,
 * 因此各大平台均建议开发者优先使用这一种授权方式。ShareSDK提供SSO的授权实现,并且默认情况下是使用的
 * <p>
 * platform.showUser(null);//授权并获取用户信息,具备独立账户系统,就是说你的应用自己就有注册和登录功能,要数据,不要功能
 * platform.authorize();//单独授权,OnComplete返回的hashmap是空的,不具备独立账户系统,要功能,不要数据(用户)
 */
public class LoginActivity extends AppCompatActivity implements PlatformActionListener {

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    Toast.makeText(LoginActivity.this, "授权登陆成功", Toast.LENGTH_SHORT).show();
                    Platform platform = (Platform) msg.obj;
                    String userId = platform.getDb().getUserId();//获取用户账号
                    String userName = platform.getDb().getUserName();//获取用户名字
                    String userIcon = platform.getDb().getUserIcon();//获取用户头像
                    String userGender = platform.getDb().getUserGender(); //获取用户性别,m = 男, f = 女,如果微信没有设置性别,默认返回null
                    Toast.makeText(LoginActivity.this, "用户名:" + userName + "  性别:" + userGender, Toast.LENGTH_SHORT).show();

                    //下面就可以利用获取的用户信息登录自己的服务器或者做自己想做的事啦!
                    //。。。
                    break;
                case 2:
                    Toast.makeText(LoginActivity.this, "授权登陆失败", Toast.LENGTH_SHORT).show();
                    break;
                case 3:
                    Toast.makeText(LoginActivity.this, "授权登陆取消", Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
    }

    public void login(View view) {
        switch (view.getId()) {
            case R.id.btn_qq_login: //qq登陆
                loginByQQ();
                break;
            case R.id.btn_wexin_login: //微信登陆
                loginByWeixin();
                break;
            case R.id.btn_weibo_login: //微博登陆
                loginByWeibo();
                break;
        }
    }

    /**
     * 微博登陆
     */
    private void loginByWeibo() {
        Platform sinaWeibo = ShareSDK.getPlatform(SinaWeibo.NAME);
        sinaWeibo.setPlatformActionListener(this);
        sinaWeibo.SSOSetting(false);
        //sinaWeibo.SSOSetting(true); // true表示不使用SSO方式授权
        if (!sinaWeibo.isClientValid()) {
            Toast.makeText(this, "新浪微博未安装,请先安装新浪微博", Toast.LENGTH_SHORT).show();
        }
        authorize(sinaWeibo);
    }

    /**
     * 微信登陆
     */
    private void loginByWeixin() {
        Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
        wechat.setPlatformActionListener(this);
        wechat.SSOSetting(false);
        if (!wechat.isClientValid()) {
            Toast.makeText(this, "微信未安装,请先安装微信", Toast.LENGTH_SHORT).show();
        }
        authorize(wechat);
    }

    /**
     * qq登陆
     */
    private void loginByQQ() {
        //        Platform platform = ShareSDK.getPlatform(QQ.NAME);
        //        //回调信息,可以在这里获取基本的授权返回的信息,但是注意如果做提示和UI操作要传到主线程handler里去执行
        //        //手动授权
        //        platform.setPlatformActionListener(new PlatformActionListener() {
        //
        //            @Override
        //            public void onError(Platform arg0, int arg1, Throwable arg2) {
        //                // TODO Auto-generated method stub
        //                arg2.printStackTrace();
        //            }
        //
        //            @Override
        //            public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) {
        //                // TODO Auto-generated method stub
        //                //输出所有授权信息
        //                arg0.getDb().exportData();
        //            }
        //
        //            @Override
        //            public void onCancel(Platform arg0, int arg1) {
        //                // TODO Auto-generated method stub
        //
        //            }
        //        });
        //        //authorize与showUser单独调用一个即可
        //        platform.authorize();//单独授权,OnComplete返回的hashmap是空的,要功能,不要数据(用户)
        //        platform.showUser(null);//授权并获取用户信息,具备独立账户系统,要数据,不要功能
        //        //移除授权
        //        //platform.removeAccount(true);

        Platform qq = ShareSDK.getPlatform(QQ.NAME);
        qq.setPlatformActionListener(this);
        qq.SSOSetting(false);
        if (!qq.isClientValid()) {
            Toast.makeText(this, "QQ未安装,请先安装QQ", Toast.LENGTH_SHORT).show();
        }
        authorize(qq);
    }

    /**
     * 授权
     *
     * @param platform
     */
    private void authorize(Platform platform) {
        if (platform == null) {
            return;
        }
        if (platform.isAuthValid()) {  //如果授权就删除授权资料
            platform.removeAccount(true);
        }

        platform.showUser(null); //授权并获取用户信息
    }

    /**
     * 授权成功的回调
     *
     * @param platform
     * @param i
     * @param hashMap
     */
    @Override
    public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
        Message message = Message.obtain();
        message.what = 1;
        message.obj = platform;
        mHandler.sendMessage(message);
    }

    /**
     * 授权错误的回调
     *
     * @param platform
     * @param i
     * @param throwable
     */
    @Override
    public void onError(Platform platform, int i, Throwable throwable) {
        Message message = Message.obtain();
        message.what = 2;
        message.obj = platform;
        mHandler.sendMessage(message);
    }

    /**
     * 授权取消的回调
     *
     * @param platform
     * @param i
     */
    @Override
    public void onCancel(Platform platform, int i) {
        Message message = Message.obtain();
        message.what = 3;
        message.obj = platform;
        mHandler.sendMessage(message);
    }
}

一键分享


    /**
     * onekeyshare分享调用九宫格方法
     */
    private void showShare() {
        OnekeyShare oks = new OnekeyShare();
        //关闭sso授权
        oks.disableSSOWhenAuthorize();

        // 分享时Notification的图标和文字  2.5.9以后的版本不调用此方法
        //oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
        // title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
        oks.setTitle("分享标题");
        // titleUrl是标题的网络链接,仅在人人网和QQ空间使用
        oks.setTitleUrl("http://sharesdk.cn");
        // text是分享文本,所有平台都需要这个字段
        oks.setText("我是分享文本");
        // imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
        oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片
        // url仅在微信(包括好友和朋友圈)中使用
        oks.setUrl("http://sharesdk.cn");
        // comment是我对这条分享的评论,仅在人人网和QQ空间使用
        oks.setComment("我是测试评论文本");
        // site是分享此内容的网站名称,仅在QQ空间使用
        oks.setSite(getString(R.string.app_name));
        // siteUrl是分享此内容的网站地址,仅在QQ空间使用
        oks.setSiteUrl("http://sharesdk.cn");

        // 启动分享GUI
        oks.show(this);
    }

指定平台分享

   /**
     * 指定平台分享
     */
    private void showShare2() {
        Platform platform = ShareSDK.getPlatform(SinaWeibo.NAME); //获取分享平台

        //设置平台监听器
        platform.setPlatformActionListener(new PlatformActionListener() {
            @Override
            public void onComplete(Platform platform, int i, HashMap<String, Object> hashMap) {
                // TODO: 2016/11/3 此方法中增加分享功能
                switch (i) {
                    case Platform.ACTION_AUTHORIZING:
                        Toast.makeText(getApplicationContext(), "授权成功", Toast.LENGTH_SHORT).show();
                        //获取分享参数
                        SinaWeibo.ShareParams params = new SinaWeibo.ShareParams();
                        String sTxt = "http://www.baidu.com/互联";//转成url编码
                        try {
                            sTxt += URLEncoder.encode("互联", "utf-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                        params.setText("测试指定平台分享 @1611 zsp 分享地址:" + sTxt);
                        platform.share(params); //开始分享
                        platform.showUser(null);
                        break;

                    case Platform.ACTION_SHARE:
                        Log.d("zsp", "分享成功");
                        Toast.makeText(getApplication(), "分享成功", Toast.LENGTH_SHORT).show();
                        break;
                    case Platform.ACTION_USER_INFOR:
                        //显示所有用户信息
                        for (Map.Entry<String, Object> e : hashMap.entrySet()) {
                            Log.d("zsp", e.getKey() + "---" + e.getValue());
                        }
                        break;
                }
            }

            @Override
            public void onError(Platform platform, int i, Throwable throwable) {

            }

            @Override
            public void onCancel(Platform platform, int i) {

            }
        });
        platform.authorize();//分享授权
    }
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值