在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拷貝: