第三方登录除了在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 mapQQ = new HashMap();//授权信息
private HashMap mapSina = new HashMap();//授权信息
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 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 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资源里
2.0.0
ShareSDK_TPL
Share SDK
用新浪微博登录
用QQ空间登录
其他帐号登录
用户信息已存在,正在跳转登录操作…
使用%s帐号登录中…
授权操作已取消
授权操作遇到错误,请阅读Logcat输出
授权成功,正在跳转登录操作…
如果您需要注册功能…
一般来说第三方登录时,第三方平台已经为您完成用户身份校验,您可以放心让用户登录。\n\n但如果您需要判断用户是否为新用户,可以在授权操作完成后,将用户的信息通过字段“HashMap userInfo”携带给login方法。客户端通过“String userId”执行登录请求,如果服务端判定此userId为未注册用户,可以将userInfo发送给注册接口,获取用户在此平台上的昵称、头像等数据,然后执行注册
确定
还有第二个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的个人信息
微博的个人信息
对于其他的,可以照葫芦画瓢,一样可以完成。(部分代码参考与网路)