• 第三方账号登录--QQ登录,以及QQ微博账号登录


    在QQ登陆测试的时候,刚申请正常登陆,但是由于app未上线,或许是腾讯升级造成的个别时候QQ登陆无法成功会提示下图代码,功能上没啥问题,已经达到 测试效果了。附上腾讯错误代码图(大家测试QQ登陆的时候,包括微博登陆都需要自行申请 AppId 以及AppKey,当然用我的也可以 )

    整体的效果图如下,大家




    MainActivity:

    package com.qiao.thirdpartylogindemo_master2;
    
    import java.util.HashMap;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler.Callback;
    import android.os.Message;
    import android.text.TextUtils;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;
    import cn.sharesdk.framework.Platform;
    import cn.sharesdk.framework.PlatformActionListener;
    import cn.sharesdk.framework.ShareSDK;
    import cn.sharesdk.framework.utils.UIHandler;
    import cn.sharesdk.sina.weibo.SinaWeibo;
    import cn.sharesdk.tencent.qzone.QZone;
    import cn.sharesdk.tencent.weibo.TencentWeibo;
    /**
     * 此demo使用第三方登陆,例子比较简单
     * @author 有点凉了
     *
     */
    public class MainActivity extends Activity implements OnClickListener,Callback,PlatformActionListener{
    	private static final String TAG="MainActivity";
    	private Button button_main_login;
    	private Button button_main_restart;
    	private Button button_main_exit;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		ShareSDK.initSDK(this);//初始化shareSdk
    		setContentView(R.layout.activity_main);
    		button_main_login = (Button)findViewById(R.id.button_main_login);
    		button_main_restart=(Button)findViewById(R.id.button_main_restart);
    		button_main_login.setOnClickListener(this);
    		button_main_restart.setOnClickListener(this);
    		findViewById(R.id.button_main_exit).setOnClickListener(this);
    		findViewById(R.id.button_main_login_weibo).setOnClickListener(this);
    		findViewById(R.id.button_main_restart_qq).setOnClickListener(this);
    	}
    
    	@Override
    	protected void onDestroy() {
    		super.onDestroy();
    		ShareSDK.stopSDK(this);
    	}
    
    	@Override
    	public void onCancel(Platform platform, int action) {
    		if (action==Platform.ACTION_USER_INFOR) {
    			UIHandler.sendEmptyMessage(3, this);
    		}
    	}
    //	如果onComplete()方法被回调,表示授权成功,引导用户进入系统
    	@Override
    	public void onComplete(Platform platform, int action, HashMap<String, Object> res) {
    		if (action ==Platform.ACTION_USER_INFOR) {
    			UIHandler.sendEmptyMessage(5, this);
    			login(platform.getName(), platform.getDb().getUserId(), res);
    			
    			Log.i(TAG, "=="+res);
    		}
    	}
    
    	@Override
    	public void onError(Platform platform, int action, Throwable t) {
    		if (action==Platform.ACTION_USER_INFOR) {
    			UIHandler.sendEmptyMessage(4, this);
    		}
    		t.printStackTrace();
    	}
    
    	@Override
    	public boolean handleMessage(Message msg) {
    		switch (msg.what) {
    		case 1:
    			Toast.makeText(this, "用户信息已存在,正在跳转登录操作…", Toast.LENGTH_SHORT).show();
    			break;
    		case 2:
    			String text = getString(R.string.logining, msg.obj);
    			Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
    			break;
    		case 3:
    			Toast.makeText(this, "授权操作已取消", Toast.LENGTH_SHORT).show();
    			break;
    		case 4:
    			Toast.makeText(this, "授权操作遇到错误,请阅读Logcat输出", Toast.LENGTH_SHORT).show();
    			break;
    		case 5:
    			Toast.makeText(this, "授权成功,正在跳转登录操作…", Toast.LENGTH_SHORT).show();
    			break;
    		default:
    			break;
    		}
    		return false;
    	}
    	//	用户触发第三方登录事件
    	@Override
    	public void onClick(View v) {
    //		Platform pf =null;
    		switch (v.getId()) {
    		case R.id.button_main_login:
    			//(1)直接使用QQ账号登陆
    			authorize(new QZone(this));// 
    			break;
    		case R.id.button_main_restart:
    			Platform pf2=ShareSDK.getPlatform(MainActivity.this,TencentWeibo.NAME);
    			if (pf2.isValid()) {
    				pf2.removeAccount();//删除授权信息
    			}
    			pf2.setPlatformActionListener(this);
    			pf2.authorize();
    			break;
    		case R.id.button_main_exit:
    			Platform pf3=ShareSDK.getPlatform(MainActivity.this,TencentWeibo.NAME);
    			Platform pf5=ShareSDK.getPlatform(MainActivity.this,QZone.NAME);
    			if (pf3.isValid()) {
    				pf3.removeAccount();//删除授权信息
    				
    			}
    			if (pf5.isValid()) {
    				pf5.removeAccount();
    			}
    			Toast.makeText(this, "退出成功,测试请点击上方登陆按钮,如果出现重新登陆界面则算成功", Toast.LENGTH_LONG).show();
    			break;
    		case R.id.button_main_login_weibo:
    			// (2)、 //使用腾讯微博登陆先要初始化腾讯微博
    			Platform pf = ShareSDK.getPlatform(MainActivity.this,TencentWeibo.NAME);
    			pf.SSOSetting(true);
    			pf.setPlatformActionListener(this);
    			pf.showUser(null);
    			Log.i(TAG, "==用户id:" + pf.getDb().getUserId() + "  用户名称:"+ pf.getDb().getUserName() + "  用户icon:"+ pf.getDb().getUserIcon() + " 这个是啥:"+ pf.getDb().getUserGender());
    			break;
    		case R.id.button_main_restart_qq:
    			Platform pf4=ShareSDK.getPlatform(MainActivity.this,QZone.NAME);
    			if (pf4.isValid()) {
    				pf4.removeAccount();
    			}
    			pf4.setPlatformActionListener(this);
    			authorize(new QZone(this));
    			break;
    		default:
    			break;
    		}
    	}
    //	authorize()方法将引导用户在授权页面输入帐号密码,然后目标平台将验证此用户(此方法在此例子中仅仅是QQ账号登陆时候使用)
    	public void authorize(Platform plat){
    		if (plat.isValid()) {
    			String userId =plat.getDb().getUserId();//获取id
    			if (!TextUtils.isEmpty(userId)) {
    				UIHandler.sendEmptyMessage(1, this);
    				login(plat.getName(),userId,null);//不等于null执行登陆,讲用户id发送至目标平台进行验证
    				return;
    			}
    		}
    		plat.setPlatformActionListener(this);
    		plat.SSOSetting(true);
    		plat.showUser(null);
    	}
    	public void login(String plat,String userId,HashMap<String, Object> userInfo){
    		Message msg = new Message();
    		msg.what = 2;
    		msg.obj = plat;
    		UIHandler.sendMessage(msg, this);
    	}
    }
    

    布局:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.qiao.thirdpartylogindemo_master2.MainActivity" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/hello_world" />
    
        <Button
            android:id="@+id/button_main_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/textView1"
            android:layout_marginTop="30dp"
            android:layout_toRightOf="@+id/textView1"
            android:text="QQ第三方登陆" />
    
        <Button
            android:id="@+id/button_main_restart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/button_main_exit"
            android:layout_centerHorizontal="true"
            android:text="切换微博账号" />
    
        <Button
            android:id="@+id/button_main_login_weibo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button_main_login"
            android:layout_below="@+id/button_main_login"
            android:text="QQ微博账号登陆" />
    
        <Button
            android:id="@+id/button_main_exit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignRight="@+id/button_main_restart"
            android:layout_marginBottom="128dp"
            android:text="退出账号" />
    
        <Button
            android:id="@+id/button_main_restart_qq"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@+id/button_main_restart"
            android:layout_alignLeft="@+id/button_main_restart"
            android:text="切换QQ账号" />
    
    </RelativeLayout>
    

     需要第三方ShareSdk支持

    assets文件夹中

    <?xml version="1.0" encoding="utf-8"?>
    <DevInfor>
        <!--
        	说明:
        	
        	1、表格中的第一项
        		<ShareSDK 
            		AppKey="api20" />
        	是必须的,其中的AppKey是您在ShareSDK上注册的开发者帐号的AppKey
        	
        	2、所有集成到您项目的平台都应该为其在表格中填写相对应的开发者信息,以新浪微博为例:
        	    <SinaWeibo
                    Id="1"
                    SortId="1"
                    AppKey="568898243"
                    AppSecret="38a4f8204cc784f81f9f0daaf31e02e3"
                    RedirectUrl="http://www.sharesdk.cn"
                    Enable="true" />
        	其中的SortId是此平台在分享列表中的位置,由开发者自行定义,可以是任何整型数字,数值越大
        	越靠后AppKey、AppSecret和RedirectUrl是您在新浪微博上注册开发者信息和应用后得到的信息
        	Id是一个保留的识别符,整型,ShareSDK不使用此字段,供您在自己的项目中当作平台的识别符。
        	Enable字段表示此平台是否有效,布尔值,默认为true,如果Enable为false,即便平台的jar包
        	已经添加到应用中,平台实例依然不可获取。
        	
        	各个平台注册应用信息的地址如下:
    			新浪微博                 http://open.weibo.com
    			腾讯微博                 http://dev.t.qq.com
    			QQ空间                      http://connect.qq.com/intro/login/
    			微信好友                 http://open.weixin.qq.com
    			Facebook      https://developers.facebook.com
    			Twitter       https://dev.twitter.com
    			人人网                      http://dev.renren.com
    			开心网                      http://open.kaixin001.com
    			搜狐微博                 http://open.t.sohu.com
    			网易微博                 http://open.t.163.com
    			豆瓣                           http://developers.douban.com
    			有道云笔记            http://note.youdao.com/open/developguide.html#app
    			印象笔记                 https://dev.evernote.com/
    			Linkedin      https://www.linkedin.com/secure/developer?newapp=
    			FourSquare    https://developer.foursquare.com/
    			搜狐随身看            https://open.sohu.com/
    			Flickr        http://www.flickr.com/services/
    			Pinterest     http://developers.pinterest.com/
    			Tumblr        http://www.tumblr.com/developers
    			Dropbox       https://www.dropbox.com/developers
    			Instagram     http://instagram.com/developer#
    			VKontakte     http://vk.com/dev
        -->
        
        <ShareSDK 
            AppKey = "31a2d4901ac0"/> <!-- 修改成你在sharesdk后台注册的应用的appkey"-->
        
        <!-- ShareByAppClient标识是否使用微博客户端分享,默认是false -->
    <!--     <SinaWeibo
            Id="1"
            SortId="1"
            AppKey="568898243"
            AppSecret="38a4f8204cc784f81f9f0daaf31e02e3"
            RedirectUrl="http://www.sharesdk.cn"
            ShareByAppClient="true"
            Enable="true" />
     -->
        <TencentWeibo
            Id="2" 
            SortId="2"
            AppKey="801530433"
            AppSecret="3ed1cc342bd5c8871aebb69ef55c5606"
            RedirectUri="http://www.baidu.com"
            Enable="true" />
    
        <!-- ShareByAppClient标识是否使用微博客户端分享,默认是false -->
      <!--   QQ账号登陆测试完成 -->
        <QZone
            Id="3"
            SortId="3"
            AppId="1102908041"
            AppKey="b70Yvb01LfSqzzKE"
            ShareByAppClient="true"
            Enable="true" />
        
       <!--  <!-- 
        	Wechat微信和WechatMoments微信朋友圈的appid是一样的;
        
                           注意:开发者不能用我们这两个平台的appid,否则分享不了
        
           	  微信测试的时候,微信测试需要先签名打包出apk,
    		sample测试微信,要先签名打包,keystore在sample项目中,密码123456
    		
    		BypassApproval是绕过审核的标记,设置为true后AppId将被忽略,故不经过
    		审核的应用也可以执行分享,但是仅限于分享文字和图片,不能分享其他类型,
    		默认值为false。此外,微信收藏不支持此字段。
    	-->
     <!--    <Wechat
            Id="4"
            SortId="4"
            AppId="wx4868b35061f87885"
            BypassApproval="true"
            Enable="true" />
        
        <WechatMoments
            Id="5"
            SortId="5"
            AppId="wx4868b35061f87885"
            BypassApproval="true"
            Enable="true" />
            
    	<WechatFavorite
            Id="6"
            SortId="6"
            AppId="wx4868b35061f87885"
            Enable="true" />
        
    	<QQ
            Id="7"
            SortId="7"
            AppId="100371282"
            AppKey="aed9b0303e3ed1e27bae87c33761161d"
            Enable="true" />
        
        <Facebook
            Id="8"
            SortId="8"
            ConsumerKey="107704292745179"
            ConsumerSecret="38053202e1a5fe26c80c753071f0b573"
            Enable="true" />
    
        <Twitter
            Id="9"
            SortId="9"
            ConsumerKey="mnTGqtXk0TYMXYTN7qUxg"
            ConsumerSecret="ROkFqr8c3m1HXqS3rm3TJ0WkAJuwBOSaWhPbZ9Ojuc"
            CallbackUrl="http://www.sharesdk.cn"
            Enable="true" />
    
        <Renren
            Id="10"
            SortId="10"
            AppId="226427"
            ApiKey="fc5b8aed373c4c27a05b712acba0f8c3"
            SecretKey="f29df781abdd4f49beca5a2194676ca4"
            Enable="true" />
        
        <KaiXin
            Id="11"
            SortId="11"
            AppKey="358443394194887cee81ff5890870c7c"
            AppSecret="da32179d859c016169f66d90b6db2a23"
            RedirectUri="http://www.sharesdk.cn"
            Enable="true" />
        
        <Email
            Id="12" 
            SortId="12"
            Enable="true" />
        
        <ShortMessage
            Id="13" 
            SortId="13"
            Enable="true" />
        
        <SohuMicroBlog
            Id="14"
            SortId="14"
            ApiKey="q70QBQM9T0COxzYpGLj9"
            ConsumerKey="q70QBQM9T0COxzYpGLj9"
            ConsumerSecret="XXYrx%QXbS!uA^m2$8TaD4T1HQoRPUH0gaG2BgBd"
            CallbackUrl="http://www.sharesdk.cn"
            Enable="true" />
    	
        <NetEaseMicroBlog
            Id="15"
            SortId="15"
            ConsumerKey="T5EI7BXe13vfyDuy"
            ConsumerSecret="gZxwyNOvjFYpxwwlnuizHRRtBRZ2lV1j"
            RedirectUri="http://www.shareSDK.cn"
            Enable="true" />
        
        <Douban
            Id="16"
            SortId="16"
            ApiKey="02e2cbe5ca06de5908a863b15e149b0b"
            Secret="9f1e7b4f71304f2f"
            RedirectUri="http://www.sharesdk.cn"
            Enable="true" />
        
        <YouDao
            Id="17"
            SortId="17"
            HostType="product"
            ConsumerKey="dcde25dca105bcc36884ed4534dab940"
            ConsumerSecret="d98217b4020e7f1874263795f44838fe"
            RedirectUri="http://www.sharesdk.cn"
            Enable="true" />
            
    	<SohuSuishenkan
            Id="18"
            SortId="18"
            AppKey="e16680a815134504b746c86e08a19db0"
            AppSecret="b8eec53707c3976efc91614dd16ef81c"
            RedirectUri="http://sharesdk.cn"
            Enable="true" />
            
        
        	在中国大陆,印象笔记有两个服务器,一个是沙箱(sandbox),一个是生产服务器(china)。
        	一般你注册应用,它会先让你使用sandbox,当你完成测试以后,可以到
        	http://dev.yinxiang.com/support/上激活你的ConsumerKey,激活成功后,修改HostType
        	为china就好了。至于如果您申请的是国际版的印象笔记(Evernote),则其生产服务器类型为
        	“product”。
        	
        	如果目标设备上已经安装了印象笔记客户端,ShareSDK允许应用调用本地API来完成分享,但
        	是需要将应用信息中的“ShareByAppClient”设置为true,此字段默认值为false。
       
        <Evernote
            Id="19"
            SortId="19"
            HostType="sandbox"
        	ConsumerKey="sharesdk-7807"
    		ConsumerSecret="d05bf86993836004"
    		ShareByAppClient="false"
    		Enable="true" />
        
        <LinkedIn
        	Id="20"
            SortId="20"
            ApiKey="ejo5ibkye3vo"
            SecretKey="cC7B2jpxITqPLZ5M" 
            RedirectUrl="http://sharesdk.cn"
            Enable="true" />
        
         <GooglePlus
        	Id="21"
            SortId="21"
            Enable="true" />
         
         <FourSquare
        	Id="22"
            SortId="22"
            ClientID="G0ZI20FM30SJAJTX2RIBGD05QV1NE2KVIM2SPXML2XUJNXEU"
            ClientSecret="3XHQNSMMHIFBYOLWEPONNV4DOTCDBQH0AEMVGCBG0MZ32XNU"
            RedirectUrl="http://www.sharesdk.cn"
            Enable="true" />
            
    	<Pinterest
        	Id="23"
            SortId="23"
            ClientId="1432928"
            Enable="true" />
         
         <Flickr
         	Id="24"
            SortId="24"
            ApiKey="33d833ee6b6fca49943363282dd313dd"
            ApiSecret="3a2c5b42a8fbb8bb"
            RedirectUri="http://www.sharesdk.cn"
            Enable="true" />
            
        <Tumblr
            Id="25"
            SortId="25"
            OAuthConsumerKey="2QUXqO9fcgGdtGG1FcvML6ZunIQzAEL8xY6hIaxdJnDti2DYwM"
    		SecretKey="3Rt0sPFj7u2g39mEVB3IBpOzKnM3JnTtxX2bao2JKk4VV1gtNo"
    		CallbackUrl="http://sharesdk.cn"
            Enable="true" />
     
    	<Dropbox
            Id="26"
            SortId="26"
            AppKey="7janx53ilz11gbs"
    		AppSecret="c1hpx5fz6tzkm32"
            Enable="true" />
            
        <VKontakte 
        	Id="27"
            SortId="27"
            ApplicationId="3921561"
            Enable="true" />
            
        <Instagram 
        	Id="28"
            SortId="28"
            ClientId="ff68e3216b4f4f989121aa1c2962d058"
    		ClientSecret="1b2e82f110264869b3505c3fe34e31a1"
    		RedirectUri="http://sharesdk.cn"
            Enable="true" />
        
        
        	Yixin易信和YixinMoments易信朋友圈的appid是一样的;
        
                           注意:开发者不能用我们这两个平台的appid,否则分享不了
        
           	 易信测试的时候需要先签名打包出apk,
    		sample测试易信,要先签名打包,keystore在sample项目中,密码123456
    		
    		BypassApproval是绕过审核的标记,设置为true后AppId将被忽略,故不经过
    		审核的应用也可以执行分享,但是仅限于分享文字或图片,不能分享其他类型,
    		默认值为false。
    	
    	<Yixin 
        	Id="29"
            SortId="29"
            AppId="yx0d9a9f9088ea44d78680f3274da1765f"
            BypassApproval="true"
            Enable="true" />
    	
    	<YixinMoments
        	Id="30"
            SortId="30"
            AppId="yx0d9a9f9088ea44d78680f3274da1765f"
            BypassApproval="true"
            Enable="true" />
    
    	<Mingdao
        	Id="31"
            SortId="31"
            AppKey="EEEE9578D1D431D3215D8C21BF5357E3"
            AppSecret="5EDE59F37B3EFA8F65EEFB9976A4E933"
            RedirectUri="http://sharesdk.cn"
            Enable="true" />  -->
    	
    </DevInfor>
    

     Mainfest

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.qiao.thirdpartylogindemo_master2"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="14"
            android:targetSdkVersion="21" />
         <supports-screens
            android:anyDensity="true"
            android:largeScreens="true"
            android:normalScreens="true"
            android:resizeable="true"
            android:smallScreens="true" />
    	<uses-permission android:name="android.permission.GET_TASKS" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>
        <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
             <activity
                android:name="cn.sharesdk.framework.ShareSDKUIShell"
                android:theme="@android:style/Theme.Translucent.NoTitleBar"
                android:configChanges="keyboardHidden|orientation|screenSize"
                android:windowSoftInputMode="stateHidden|adjustResize" />
        </application>
    
    </manifest>
    

    values:需要(直接ShareSdk拷贝)

    jar包直接ShareSdk拷贝:

  • 相关阅读:
    CodeforcesBeta Round #19 D. Points 离线线段树 单点更新 离散化
    挑战练习题3.3 POJ 2886 Who Gets the Most Candies? 树状数组
    hdu4288 Coder 离线线段树 单点更新 区间求和 离散化?
    zoj 1610 Count the Colors 线段树 区间更新
    51nod 1307 绳子与重物 二分+dfs / 并查集
    51nod 1116 K进制下的大数 暴力/数论
    Wannafly2016-12-27 SPOJ-INTSUB 数学
    C++——Vector
    LEDE Project
    Raspberry Pi 3 with Openwrt
  • 原文地址:https://www.cnblogs.com/qobn/p/3979000.html
Copyright © 2020-2023  润新知