上一篇 算是详细的说了友盟第三方分享,这里就说下第三方登录的这个功能。
我们看友盟官网的社会化分享API中 分享和登录是在一起的,就是在同一个jar里。所以我们集成了分享,登录的配置差不多了,官网有对应的配置,我写的分享中的清单文件就已经包含了登录需要的配置,大家可以直接去对比一下就可以了。
在这里我声明一下 我在这个项目里没有加入腾讯和新浪微博的SSO授权 所以会导致每次都要去页面授权的情况,当时加入SSO文件,也不知道什么原因导致分享不成功和登录等一系列的问题,开发时间也就几天所以就没有去仔细研究,有大神有新的看法可以告诉我。
在我的项目里是需要QQ 微信 新浪微博 这个三个登录 这里我会去上传一份分享和登录的demo 供大家参考
登录的流程
由于我的demo 是整合分享和登录在一起的 那么结合上一篇分享 我这里贴一份完整的 唯一有改变的类 MainActivity.java
main布局 就是4个按钮而已,就不贴了。
package com.ffu365.android;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import com.ffu365.android.R;
import com.umeng.socialize.Config;
import com.umeng.socialize.ShareAction;
import com.umeng.socialize.UMAuthListener;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.UMShareListener;
import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.view.UMFriendListener;
public class MainActivity extends Activity implements UMShareListener,
OnClickListener {
/*
* umneg SDK 版本 5.2.0
*/
private UMShareAPI mShareAPI;
// private UMSocialService mController;
private Context context = MainActivity.this;
private boolean usinfo = true;
private Button mShareBt, mLoginBtqq, mLoginBtsina, mLoginBtwx;
// http://image.7pa.com/data/579343ab50e0d.png
// http://tva3.sinaimg.cn/crop.0.0.744.744.50/005Y5jzejw8f6hpwhu2kcj30ko0kodgi.jpg
// 设置分享网络url "http://www.umeng.com/images/pic/social/integrated_3.png"
UMImage image = new UMImage(this,
"http://image.7pa.com/data/57a55cb2c9078.png");
// 设置分享图片,参数2为本地图片的资源引用
// UMImage image = new UMImage(MainActivity.this,
// BitmapFactory.decodeResource(getResources(), R.drawable.image));
// 设置分享图片,参数2为本地图片的路径(绝对路径)
// UMImage image = new UMImage(MainActivity.this,
// BitmapFactory.decodeFile("/mnt/sdcard/icon.png")));
// 设置分享音乐 包括缩略图
// UMusic music = new
// UMusic("http://music.huoxing.com/upload/20130330/1364651263157_1085.mp3");
// music.setTitle("sdasdasd");
// music.setThumb(new
// UMImage(ShareActivity.this,"http://www.umeng.com/images/pic/social/chart_1.png"));
// 设置分享视频
// UMVideo video = new
// UMVideo("http://video.sina.com.cn/p/sports/cba/v/2013-10-22/144463050817.html");
final SHARE_MEDIA[] displaylist = new SHARE_MEDIA[] { SHARE_MEDIA.WEIXIN,
SHARE_MEDIA.WEIXIN_CIRCLE, SHARE_MEDIA.QQ, SHARE_MEDIA.QZONE,
SHARE_MEDIA.SINA };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("授权中");
dialog.setMessage("正在加载···");
Config.dialog = dialog;
com.umeng.socialize.utils.Log.LOG = true;
XHLog.is_debug = true;
mShareAPI = UMShareAPI.get(this);
mShareBt = (Button) findViewById(R.id.share_bt);
mShareBt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new ShareAction(MainActivity.this).setDisplayList(displaylist)
.withText("andriod端测试")
// app内容
.withTitle("app分享第三方微信测试")
.withTargetUrl("http://www.baidu.com")// 标题加 链接
.withMedia(image).setCallback(MainActivity.this)//
.open();
}
});
mLoginBtqq = (Button) findViewById(R.id.login_bt_qq);
mLoginBtsina = (Button) findViewById(R.id.login_bt_sina);
mLoginBtwx = (Button) findViewById(R.id.login_bt_wx);
mLoginBtqq.setOnClickListener(this);
mLoginBtsina.setOnClickListener(this);
mLoginBtwx.setOnClickListener(this);
}
/**
* 分享的回调
*/
@Override
public void onCancel(SHARE_MEDIA arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onCancel 取消", Toast.LENGTH_LONG).show();
}
@Override
public void onError(SHARE_MEDIA arg0, Throwable arg1) {
// TODO Auto-generated method stub
Toast.makeText(this, "onError 失败", Toast.LENGTH_LONG).show();
}
@Override
public void onResult(SHARE_MEDIA arg0) {
// TODO Auto-generated method stub
Toast.makeText(this, "onSucced 成功", Toast.LENGTH_LONG).show();
}
/**
* Sina 获取朋友列表信息
*
*/
private UMFriendListener umGetfriendListener = new UMFriendListener() {
@Override
public void onError(SHARE_MEDIA arg0, int arg1, Throwable arg2) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(SHARE_MEDIA arg0, int arg1,
Map<String, Object> data) {
// TODO Auto-generated method stub
XHLog.e("TAG!!!!!!!!!", data + "");
// Toast.makeText(MainActivity.this, data + "",
// Toast.LENGTH_LONG).show();
}
@Override
public void onCancel(SHARE_MEDIA arg0, int arg1) {
// TODO Auto-generated method stub
}
};
/**
* 第三方登录点击 必须先调用授权方法doOauthVerify 才能调用用户信息方法getPlatformInfo 在授权回调里调用
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login_bt_qq:
// QQ登录授权
SHARE_MEDIA platform1 = SHARE_MEDIA.QQ;
mShareAPI.doOauthVerify(MainActivity.this, platform1,
umAuthListener);// 对app进行授权
break;
case R.id.login_bt_sina:
// Sina登录授权
SHARE_MEDIA platform2 = SHARE_MEDIA.SINA;
mShareAPI.doOauthVerify(MainActivity.this, platform2,
umAuthListener);
// Sina 可以读取到你关注有那些人
// mShareAPI.getFriend(MainActivity.this, SHARE_MEDIA.SINA,
// umGetfriendListener);
break;
case R.id.login_bt_wx:
// WEIXIN登录授权
SHARE_MEDIA platform3 = SHARE_MEDIA.WEIXIN;
mShareAPI.doOauthVerify(MainActivity.this, platform3,
umAuthListener);
break;
}
}
/**
* 第三方登录回调授权
*
*/
private UMAuthListener umAuthListener = new UMAuthListener() {
public void onComplete(SHARE_MEDIA platform, int action,
Map<String, String> data) {
// mShareAPI.getPlatformInfo(MainActivity.this, platform,
// umAuthListener);
if (usinfo) {
usinfo = false;
Toast.makeText(getApplicationContext(),
"Authorize succeed 授权成功", Toast.LENGTH_SHORT).show();
getUserInfo(context, platform);
} else {
XHLog.e("TAG=====", data + "");
// Toast.makeText(getApplicationContext(), data + "=====",
// Toast.LENGTH_SHORT).show();
// if(platform==SHARE_MEDIA.QQ){
// //发送数据到后台
// Map<String, String> dataInfo = new HashMap<String, String>();
// dataInfo.put("id", data.get("openid").toString());
// dataInfo.put("sex", data.get("gender").toString());//男 女
// dataInfo.put("name", data.get("screen_name").toString());
// dataInfo.put("headurl", data.get("image_url").toString());
// dataInfo.put("location", data.get("location").toString());
//
//
// }
// if(platform==SHARE_MEDIA.SINA){
// //发送数据到后台
// Map<String, String> dataInfo = new HashMap<String, String>();
// dataInfo.put("id", data.get("id").toString());
// dataInfo.put("sex", data.get("gender").toString());//m是男 f是女
// dataInfo.put("name", data.get("screen_name").toString());
// dataInfo.put("headurl",
// data.get("profile_image_url").toString());
// dataInfo.put("location", data.get("location").toString());
//
//
// }
// if(platform==SHARE_MEDIA.WEIXIN){
// //发送数据到后台
// dataInfo.put("openid", data.get("unionid"));
// dataInfo.put("gender", data.get("gender"));//男 女
// dataInfo.put("screen_name", data.get("screen_name"));
// dataInfo.put("profile_image_url",
// data.get("profile_image_url"));
// dataInfo.put("city", data.get("city"));
// }
}
}
@Override
public void onError(SHARE_MEDIA platform, int action, Throwable t) {
Toast.makeText(getApplicationContext(), "Authorize fail 授权失败",
Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel(SHARE_MEDIA platform, int action) {
Toast.makeText(getApplicationContext(), "Authorize cancel 授权取消",
Toast.LENGTH_SHORT).show();
}
};
/**
* 拿用户信息的方法
*
* @param context
* @param platform
*/
private void getUserInfo(Context context, SHARE_MEDIA platform) {
mShareAPI.getPlatformInfo((Activity) context, platform, umAuthListener);// 拿用户信息的方法
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);
}
}
在集成项目中把分享那部分分开就好,放入你对应的Login类里 。
这里有个很关键的是获取了哪些用户字段,这里你可以在回调方法 onComplete中去打印一下 demo里是我项目需要的用户信息 可以参考
但是我们要注意要打开友盟对于登录提供的debug 开关
关闭log和toast Log.LOG = false Config.IsToastTip = false 改为true就好
另外我这里加了一个标签 因为我打印的log第一次是手机配置等一些和用户无关的信息,第二次打印的data 才是用户信息。
这里我提供一个友盟我们会碰到的问题集合 地址常见错误集合
很多问题都是在论坛里看到的,虽然很多已经很久了,但是总会有帮助的。
接下来我针对友盟dirlog 进行覆盖和自定义
直接上代码
ThreeDirlog.java
package com.qpp.view;
import android.app.Dialog;
import android.content.Context;
import android.view.WindowManager;
import com.qpbox.R;
public class ThreeDirlog extends Dialog {
private static final String TAG = ThreeDirlog.class.getName();
private int view = R.layout.three_dirlog;
public static Dialog dialog;
//单例
public static Dialog init(Context context) {
if (dialog == null) {
synchronized (TAG) {
if (dialog == null) {
dialog = new ThreeDirlog(context);
}
}
}
return dialog;
}
public ThreeDirlog(Context context) {
this(context, R.style.dialog_tran);
this.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
}
public ThreeDirlog(Context context, int theme) {
super(context, theme);
// TODO Auto-generated constructor stub
}
protected ThreeDirlog(Context context, boolean cancelable,
OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
// TODO Auto-generated constructor stub
}
@Override
public void show() {
// TODO Auto-generated method stub
super.show();
getWindow().setContentView(view);
}
}
three_dirlog .XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="300dip"
android:layout_height="wrap_content"
android:background="@drawable/white_radiu"
android:gravity="center_horizontal"
android:orientation="vertical" >
<LinearLayout
android:id="@+id/share_queding"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="50dip"
android:gravity="center"
android:text="授权中..."
android:textColor="@color/text_color2"
android:textSize="@dimen/text_size4" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
这里我们原来友盟的提供的dirlog
ProgressDialog dialog = new ProgressDialog(this);
dialog.setTitle("授权中");
dialog.setMessage("正在加载···");
Config.dialog = dialog;
<span style="white-space:pre"> </span>//自定义的dirlog
Config.dialog = ThreeDirlog.dialog;
//QQ登录授权
SHARE_MEDIA platform1 = SHARE_MEDIA.QQ;
mShareAPI.doOauthVerify(QiPaLoginActivity.this, platform1,
umAuthListener);//
自定义的dirlog 可以根据需求来
因为这是一个全局的dirlog 所以我使用前要初始化 在Application.java 的onCreate() 方法里
//全局dirlog初始化
ThreeDirlog.init(this);
之后我会添加友盟第三方分享和登录的demo
最后 我这里说明一下QQ登录在审核上线之前是要去腾讯开发平台配置 调试QQ号,成功上线后也要打包才能调试。 微信分享和登录必须上线后才可以测试,而且必须打包测试,新浪微博是比微信更具有bug的第三方 请一定要配置好新浪开放平台对应的回调地址配置和安全域名配置
安全域名 sns.whalecloud.com
demo 下载地址:demo
谢谢