在現在的項目開發,調用第三方登錄,幾乎是必須的,而調用QQ登錄也是必不可少的,這里把相關代碼分享出來,
希望能拿去就可以用,減少項目開發的時間,希望對大家有用。
1,去QQ開放平台注冊帳號( http://open.qq.com/),為應用申請QQ的APP_ID , 並下載相關的jar包,放到工程的lib目錄下。
2,在Manifest.xml里注冊QQ相關的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提供的相關API去獲取相關的OPENID,昵稱,圖像等資料。這里有一點要注意的是,由於QQ服務器返回OPENID和昵稱等其他資料是分兩步進行的,
而首先返回的 OPENID速度很快,返回昵稱等其他資料可能會比較慢,所以在返回OPENID的時候,就可以認為已經調用QQ登錄成功,
再用異步的方式處理昵稱等其他資料信息。以下是代碼部 分,已經過項目測試,可直接用(替換相應的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);
//發送廣播到主頁去更新
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) {
}
}
/**
* 授權完成后,執行一下步的回調
*/
public static abstract class QqLoginListener{
public void onLoginSuccess(String openid){};
public void onLoginSuccess(String openid, String nickname){};
public void onLoginFail(){};
public void onCancel(){};
}
好了,到里代碼部分已經寫完,只需要調用login(Activity context , QqLoginListener loginListener)方法就可以了。
參考於:https://blog.csdn.net/eastman520/article/details/46423251
