友盟第三方登录 QQ 微信 新浪微博 自定义友盟的dirlog

原创 2016年08月30日 17:57:20

上一篇 算是详细的说了友盟第三方分享,这里就说下第三方登录的这个功能。 

 我们看友盟官网的社会化分享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);


当然建议自定义的dirlog也可以直接写Application.java



之后我会添加友盟第三方分享和登录的demo


最后 我这里说明一下QQ登录在审核上线之前是要去腾讯开发平台配置 调试QQ号,成功上线后也要打包才能调试。  微信分享和登录必须上线后才可以测试,而且必须打包测试,新浪微博是比微信更具有bug的第三方 请一定要配置好新浪开放平台对应的回调地址配置和安全域名配置

安全域名 sns.whalecloud.com 

demo 下载地址:demo

  谢谢 

















版权声明:本文为博主原创文章,未经博主允许不得转载。

ShareSDK集成微信、QQ、微博分享

1、前言 为什么要使用第三方的作为集成分享的工具呢?而不去用官方的呢?有什么区别么? 一个字”快”,如果你使用官方的得一个个集成他们的SDK,相信这是一个痛苦的过程。2、准备需要分...

Android使用shareSDK第三方登录(qq,微信,微博)

第一步:下载SDK:http://www.mob.com/#/downloadDetail/ShareSDK/android,选择自己要集成的平台,下载 解压文件,打开ShareSDK for And...
  • gggccy
  • gggccy
  • 2016年10月25日 16:14
  • 451

友盟社会化分享之判断是否安装了QQ、微信、新浪微博客户端

一、判断是否安装了微信客户端 1、在.m文件中到入头文件:#import "WXApi.h" 2、调用是否安装了微信的方法isWXAppInstalled:     if ([WXApi isWXAp...

友盟分享—QQ、QQ空间、新浪微博、微信

请按着步骤一步一步来、最后自然会做出来;当然你也可以看友盟的demo只要你不嫌麻烦。第一步:在友盟官网[友盟官网](http://www.umeng.com/)注册账号,创建一个移动应用,获取APPk...

友盟第三方登录(QQ、Sina、微信)

  • 2015年10月27日 15:55
  • 3.71MB
  • 下载

友盟分享中 分享QQ及新浪微博中的一些遇到分享失败及一些常见问题

QQ分享: 问题1:在第二次点击分享QQ的图标时,还未进行分享便已弹出分享失败的提示,偶尔还会弹很多次 问题2:在分享成功之后点击返回无法完成 SnsPostListener的onComplete中的...

友盟分享(微信、QQ、微博)

  • 2015年11月13日 15:20
  • 9.57MB
  • 下载

Android集成友盟社会化分享组件 ---- 分享到新浪、微信、QQ空间、腾讯微博等平台

Android集成友盟社会化分享组件 ---- 分享到新浪、微信、QQ空间、腾讯微博等平台...

友盟,新浪微博,腾讯QQ分享的一些心得与总结,以及遇到的一些坑

感言:分享都是第三方,不管是原生第三方,还是集成的第三方,因此只有.h文件而没有.m文件,只能调用写好的方法,却没办法修改,只有在别人封装好的基础上进行自定义。对于像博主一样的对于分享研究的不深的开发...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:友盟第三方登录 QQ 微信 新浪微博 自定义友盟的dirlog
举报原因:
原因补充:

(最多只允许输入30个字)