第三方賬號登錄--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拷貝:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM