Android知识程序员今日看点

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

2016-09-20  本文已影响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的个人信息


微博的个人信息

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

猜你喜欢

热点阅读