美文网首页Android知识程序员今日看点
ShareSdk的第三方登录QQ和微博(Mob)--个人笔记

ShareSdk的第三方登录QQ和微博(Mob)--个人笔记

作者: 不识水的鱼 | 来源:发表于2016-09-20 20:57 被阅读1834次

    第三方登录除了在qq平台申请,也可以用mob 的shareSDK来登录,不过前提是之前先嵌入好了shareSDK分享功能的,前面的分享这里就不多说了,主要是做登录,分享的具体做法,可以看mob官网的方法,提供一个链接
    mob的分享快速集成指南
    这里保证你的demo能够完成分享功能,如下图所示


    之后是一些配置问题,在ShareSDK.xml里面配置自己的appid

    记得在登录前必须先初始化
    ShareSDK.initSDK(this);
    

    之后就是mainActivity的代码了:
    这里包含了两个页面,也写了分享功能在里面

    package com.example.yukun.webapplication;
    
    import android.content.Intent;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.widget.TextView;
    import android.widget.Toast;
    
    
    import com.mob.tools.utils.UIHandler;
    
    import java.util.HashMap;
    
    import cn.sharesdk.framework.Platform;
    import cn.sharesdk.framework.PlatformActionListener;
    import cn.sharesdk.framework.ShareSDK;
    import cn.sharesdk.onekeyshare.OnekeyShare;
    import cn.sharesdk.tencent.qq.QQ;
    import cn.sharesdk.tencent.weibo.TencentWeibo;
    
    public class ShareActivity extends AppCompatActivity implements PlatformActionListener, Handler.Callback {
    private static final int MSG_USERID_FOUND = 1;//用户已经存在
    private static final int MSG_LOGIN = 2;//登录中
    private static final int MSG_AUTH_CANCEL = 3;//取消授权
    private static final int MSG_AUTH_ERROR = 4;//授权出错
    private static final int MSG_AUTH_COMPLETE = 5;//授权成功
    private HashMap<String, Object> mapQQ = new HashMap<String, Object>();//授权信息
    private HashMap<String, Object> mapSina = new HashMap<String, Object>();//授权信息
    private SquareProgressBar squareProgressBar;
    private TextView textView;
    private com.example.yukun.webapplication.squareprogressbar.SquareProgressBar progressBar;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_share);
        ShareSDK.initSDK(this);
        init();
    }
       //第一个按钮,表示分享
    public void Btn1(View view) {
        showShare();
    }
    
    //第二个按钮表示qq登录
    public void Btn2(View view) {
        authorize(new QQ(this));
    }
    
    //第三个按钮表示微博登录
    public void Btn3(View view) {
        authorize(new TencentWeibo(this));
    }
    
    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("title");
        // titleUrl是标题的网络链接,仅在人人网和QQ空间使用
        oks.setTitleUrl("http://sharesdk.cn");
        // text是分享文本,所有平台都需要这个字段
        oks.setText("我是分享文本");
        //分享网络图片,新浪微博分享网络图片需要通过审核后申请高级写入接口,否则请注释掉测试新浪微博
        oks.setImageUrl("http://f1.sharesdk.cn/imgs/2014/02/26/owWpLZo_638x960.jpg");
        // 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 authorize(Platform plat) {
        if (plat.isValid()) {
            String userId = plat.getDb().getUserId();
            Log.i("----id",userId);
            if (!TextUtils.isEmpty(userId)) {
                UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);
                if (plat.getName().equals("QQ")) {
                    login(plat.getName(), userId, mapQQ);
    
                }
                else if (plat.getName().equals("TencentWeibo")) {
                    login(plat.getName(), userId, mapSina);
                }
                return;
            }
        }
        //若本地没有授权过就请求用户数据
        plat.setPlatformActionListener(this);//
        plat.SSOSetting(false);//此处设置为false,则在优先采用客户端授权的方法,设置true会采用网页方式
        plat.showUser(null);//获得用户数据
    
    }
    
    private void login(String plat, String userId, HashMap<String, Object> userInfo) {
    
        Message msg = new Message();
        msg.what = MSG_LOGIN;
        msg.obj = plat;
        UIHandler.sendMessage(msg, this);
        //跳转到第二个页面,获取到的数据就在这里
        Intent intent = new Intent(ShareActivity.this, SecondActivity.class);
        intent.putExtra("userinfo", "userinfo:" + userInfo.toString());
        startActivity(intent);
    }
    
    //一定要停止
    @Override
    protected void onDestroy() {
        ShareSDK.stopSDK(this);
        super.onDestroy();
    }
    
    public void onComplete(Platform platform, int action,
                           HashMap<String, Object> res) {
        if (action == Platform.ACTION_USER_INFOR) {
            Log.e("ShareActivity", platform.getName());
            if (platform.getName().equals("QQ")) {
                mapQQ.clear();
                mapQQ.putAll(res);
            }
            else if (platform.getName().equals("TencentWeibo")) {
                mapSina.clear();
                mapSina.putAll(res);
            }
    //            else if (platform.getName().equals("Facebook")) {
    //                mapFB.clear();
    //                mapFB = res;
    //            }
    //            else if (platform.getName().equals("GooglePlus")) {
    //                mapGG.clear();
    //                mapGG = res;
    //            }
            UIHandler.sendEmptyMessage(MSG_AUTH_COMPLETE, this);
            login(platform.getName(), platform.getDb().getUserId(), res);
        }
        System.out.println(res);
    }
    
    public void onError(Platform platform, int action, Throwable t) {
        if (action == Platform.ACTION_USER_INFOR) {
            UIHandler.sendEmptyMessage(MSG_AUTH_ERROR, this);
        }
        t.printStackTrace();
    }
    
    public void onCancel(Platform platform, int action) {
        if (action == Platform.ACTION_USER_INFOR) {
            UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL, this);
        }
    }
    
    @Override
    public boolean handleMessage(Message message) {
        switch (message.what) {
            case MSG_USERID_FOUND: {
                Toast.makeText(this, R.string.userid_found, Toast.LENGTH_SHORT).show();
            }
            break;
            case MSG_LOGIN: {
                String text = getString(R.string.logining, message.obj);
                Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
            }
            break;
            case MSG_AUTH_CANCEL: {
                Toast.makeText(this, R.string.auth_cancel, Toast.LENGTH_SHORT).show();
            }
            break;
            case MSG_AUTH_ERROR: {
                Toast.makeText(this, R.string.auth_error, Toast.LENGTH_SHORT).show();
            }
            break;
            case MSG_AUTH_COMPLETE: {
                Toast.makeText(this, R.string.auth_complete, Toast.LENGTH_SHORT).show();
            }
            break;
        }
        return false;
        }
    }
    

    还有一些string的字符,记得拷贝到string资源里

    <string name="app_version">2.0.0</string>
    <string name="proj_name">ShareSDK_TPL</string>
    <string name="share_sdk">Share SDK</string>
    <string name="login_with_sina_weibo">用新浪微博登录</string>
    <string name="login_with_qzone">用QQ空间登录</string>
    <string name="login_with_other_plat">其他帐号登录</string>
    <string name="userid_found">用户信息已存在,正在跳转登录操作…</string>
    <string name="logining">使用%s帐号登录中…</string>
    <string name="auth_cancel">授权操作已取消</string>
    <string name="auth_error">授权操作遇到错误,请阅读Logcat输出</string>
    <string name="auth_complete">授权成功,正在跳转登录操作…</string>
    <string name="if_register_needed">如果您需要注册功能…</string>
    <string name="after_auth">一般来说第三方登录时,第三方平台已经为您完成用户身份校验,您可以放心让用户登录。\n\n但如果您需要判断用户是否为新用户,可以在授权操作完成后,将用户的信息通过字段“HashMap userInfo”携带给login方法。客户端通过“String userId”执行登录请求,如果服务端判定此userId为未注册用户,可以将userInfo发送给注册接口,获取用户在此平台上的昵称、头像等数据,然后执行注册</string>
    <string name="ok">确定</string>
    

    还有第二个activity,用来显示获取到的个人数据的 ,只有一个textview

    package com.example.yukun.webapplication;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class SecondActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        TextView tv = (TextView) this.findViewById(R.id.tv);
        String text = getIntent().getStringExtra("userinfo");
        tv.setText(text);
    }
    }
    

    效果图如下所示:
    其中获取到的userInfo是map集合,具体的解析过程,可以在网上查查,解析出Map里面的个人信息
    qq的个人信息


    微博的个人信息

    对于其他的,可以照葫芦画瓢,一样可以完成。(部分代码参考与网路)

    相关文章

      网友评论

        本文标题:ShareSdk的第三方登录QQ和微博(Mob)--个人笔记

        本文链接:https://www.haomeiwen.com/subject/lfboettx.html