Android調(diào)用第三方QQ登錄代碼分享
本文為大家分享了調(diào)用QQ登錄的相關(guān)代碼,希望對大家有幫助,減少項目開發(fā)的時間,具體內(nèi)容如下
1、去QQ開放平臺注冊帳號(http://open.qq.com/),為應(yīng)用申請QQ的APP_ID , 并下載相關(guān)的jar包,放到工程的lib目錄下。
2、在Manifest.xml里注冊QQ相關(guān)的Activity,代碼如下
<activity android:name="com.tencent.connect.common.AssistActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar" /> <activity android:name="com.tencent.tauth.AuthActivity" android:launchMode="singleTask" android:noHistory="true" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tencent100491239" /> </intent-filter> </activity>
3、利用QQ提供的相關(guān)API去獲取相關(guān)的OPENID,昵稱,圖像等資料。這里有一點(diǎn)要注意的是,由于QQ服務(wù)器返回OPENID和昵稱等其他資料是分兩步進(jìn)行的,而首先返回的OPENID速度很快,返回昵稱等其他資料可能會比較慢,所以在返回OPENID的時候,就可以認(rèn)為已經(jīng)調(diào)用QQ登錄成功,再用異步的方式處理昵稱等其他資料信息。以下是代碼部 分,已經(jīng)過項目測試,可直接用(替換相應(yīng)的APP_ID就可以了)
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import com.smart.util.BroadcastAction;
import com.smart.util.BroadcastUtil;
import com.smart.util.Constant;
import com.smart.util.ILog;
import com.smart.util.PrefUtil;
import com.smart.util.Prefkey;
import com.tencent.open.HttpStatusException;
import com.tencent.open.NetworkUnavailableException;
import com.tencent.tauth.Constants;
import com.tencent.tauth.IRequestListener;
import com.tencent.tauth.IUiListener;
import com.tencent.tauth.Tencent;
import com.tencent.tauth.UiError;
import com.utils.lib.ss.common.ToastHelper;
/**
* QQ登陸。
* @author E
*/
public class QqLogin {
private static QqLogin qqLogin = null;
public static QqLogin getInstance(){
if (null == qqLogin) {
qqLogin = new QqLogin();
}
return qqLogin;
}
public void login(Activity context , QqLoginListener loginListener){
//Constant.QQ_APP_ID 這里要替換成自己申請的APP_ID
Tencent tencent = Tencent.createInstance(Constant.QQ_APP_ID, context);
if (null == tencent) {
ToastHelper.makeText(context, "error cased !");
return;
}
tencent.login(context, "get_user_info", new BaseUiListener(tencent,loginListener));
}
class BaseUiListener implements IUiListener{
Tencent tencent = null;
QqLoginListener qqLoginListener = null;
public BaseUiListener(Tencent tencent ,QqLoginListener qqLoginListener) {
super();
this.tencent = tencent;
this.qqLoginListener = qqLoginListener;
}
@Override
public void onComplete(JSONObject values) {
try {
String openid = values.getString("openid");
qqLoginListener.onLoginSuccess(openid);
tencent.requestAsync(Constants.GRAPH_SIMPLE_USER_INFO, null, Constants.HTTP_GET,
new BaseApiListener(qqLoginListener) ,null);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onError(UiError arg0) {
qqLoginListener.onLoginFail();
}
@Override
public void onCancel() {
qqLoginListener.onCancel();
}
}
class BaseApiListener implements IRequestListener{
QqLoginListener qqLoginListener = null;
public BaseApiListener(QqLoginListener qqLoginListener) {
super();
this.qqLoginListener = qqLoginListener;
}
@Override
public void onComplete(JSONObject jsonObject, Object object) {
try {
ILog.e(jsonObject.toString());
String nickName = jsonObject.getString("nickname");
String figureurl_qq_1 = jsonObject.getString("figureurl_qq_2");
PrefUtil.instance().setPref(Prefkey.THIRD_NICKNAME, nickName);
PrefUtil.instance().setPref(Prefkey.THIRD_IMAGE, figureurl_qq_1);
//發(fā)送廣播到主頁去更新
BroadcastUtil.sendBroadcast(BroadcastAction.UPLOAD_THIRD_INFO);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onConnectTimeoutException(ConnectTimeoutException arg0,
Object arg1) {
}
@Override
public void onHttpStatusException(HttpStatusException arg0, Object arg1) {
}
@Override
public void onIOException(IOException arg0, Object arg1) {
}
@Override
public void onJSONException(JSONException arg0, Object arg1) {
}
@Override
public void onMalformedURLException(MalformedURLException arg0,
Object arg1) {
}
@Override
public void onNetworkUnavailableException(
NetworkUnavailableException arg0, Object arg1) {
}
@Override
public void onSocketTimeoutException(SocketTimeoutException arg0,
Object arg1) {
}
@Override
public void onUnknowException(Exception arg0, Object arg1) {
}
}
/**
* 授權(quán)完成后,執(zhí)行一下步的回調(diào)
*/
public static abstract class QqLoginListener{
public void onLoginSuccess(String openid){};
public void onLoginSuccess(String openid, String nickname){};
public void onLoginFail(){};
public void onCancel(){};
}
好了,到里代碼部分已經(jīng)寫完,只需要調(diào)用login(Activity context , QqLoginListener loginListener)方法就可以了。
以上就是Android調(diào)用第三方登錄的詳細(xì)步驟和思路,希望對大家的學(xué)習(xí)有所幫助。
相關(guān)文章
Android實現(xiàn)動態(tài)圓環(huán)的圖片頭像控件
這篇文章主要為大家詳細(xì)介紹了Android實現(xiàn)帶有動態(tài)圓環(huán)的圓形圖片控件DynamicAvatarView的相關(guān)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11
RecyclerView仿應(yīng)用列表實現(xiàn)網(wǎng)格布局
這篇文章主要為大家詳細(xì)介紹了RecyclerView仿應(yīng)用列表實現(xiàn)網(wǎng)格布局,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09
Android Studio Gradle 更換阿里云鏡像的方法
這篇文章主要介紹了Android Studio Gradle 更換阿里云鏡像的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Flutter?彈性布局基石flex算法flexible示例詳解
這篇文章主要為大家介紹了Flutter?彈性布局基石flex算法flexible示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12

