Android开发全程记录(四)——使用QQ登陆第三方应用

来源:互联网 发布:模拟钢琴软件 编辑:程序博客网 时间:2024/05/16 07:10

要使用QQ完成第三方应用的授权登陆,大致有以下几个步骤:

1.首先注册成为QQ开放平台开发者,登陆QQ互联开放平台,一定是互联开放平台而不是QQ开放平台,地址:http://connect.qq.com/intro/login
2.下载Android SDK 
地址:http://wiki.connect.qq.com/sdk%e4%b8%8b%e8%bd%bd
3.查看文档(没怎么细看,直接看demo了)
地址:http://wiki.connect.qq.com/%e4%bd%bf%e7%94%a8sdk%e5%ae%9e%e7%8e%b0qq%e7%9a%84%e7%99%bb%e5%bd%95%e5%92%8c%e6%b3%a8%e9%94%80_android_sdk
4.运行jar包里的demo,会看到腾讯为我们提供的各种示例。

 

下面给出详细步骤:

1)新建Android项目,将sdk中的两个jar包:mta-sdk-1.6.2.jar和open_sdk.jar,并将这两个jar包Add to Build path。

2)MainActivity.java中代码如下:

package com.example.qqloginsample;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.content.Context;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.Color;import android.os.Bundle;import android.os.Handler;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.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import android.widget.Toast;import com.example.util.Util;import com.tencent.connect.UserInfo;import com.tencent.connect.auth.QQAuth;import com.tencent.tauth.IUiListener;import com.tencent.tauth.Tencent;import com.tencent.tauth.UiError;public class MainActivity extends Activity {private static final String TAG = MainActivity.class.getName();public static String mAppid;private Button mNewLoginButton;private TextView mUserInfo;private ImageView mUserLogo;public static QQAuth mQQAuth;private UserInfo mInfo;private Tencent mTencent;private final String APP_ID = "222222";// 测试时使用,真正发布的时候要换成自己的APP_ID@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG, "-->onCreate");// 固定竖屏setContentView(R.layout.activity_main);initViews();}@Overrideprotected void onStart() {Log.d(TAG, "-->onStart");final Context context = MainActivity.this;final Context ctxContext = context.getApplicationContext();mAppid = APP_ID;mQQAuth = QQAuth.createInstance(mAppid, ctxContext);mTencent = Tencent.createInstance(mAppid, MainActivity.this);super.onStart();}@Overrideprotected void onResume() {Log.d(TAG, "-->onResume");super.onResume();}@Overrideprotected void onPause() {Log.d(TAG, "-->onPause");super.onPause();}@Overrideprotected void onStop() {Log.d(TAG, "-->onStop");super.onStop();}@Overrideprotected void onDestroy() {Log.d(TAG, "-->onDestroy");super.onDestroy();}private void initViews() {mNewLoginButton = (Button) findViewById(R.id.new_login_btn);LinearLayout linearLayout = (LinearLayout) findViewById(R.id.main_container);OnClickListener listener = new NewClickListener();for (int i = 0; i < linearLayout.getChildCount(); i++) {View view = linearLayout.getChildAt(i);if (view instanceof Button) {view.setOnClickListener(listener);}}mUserInfo = (TextView) findViewById(R.id.user_nickname);mUserLogo = (ImageView) findViewById(R.id.user_logo);updateLoginButton();}private void updateLoginButton() {if (mQQAuth != null && mQQAuth.isSessionValid()) {mNewLoginButton.setTextColor(Color.RED);mNewLoginButton.setText(R.string.qq_logout);} else {mNewLoginButton.setTextColor(Color.BLUE);mNewLoginButton.setText(R.string.qq_login);}}private void updateUserInfo() {if (mQQAuth != null && mQQAuth.isSessionValid()) {IUiListener listener = new IUiListener() {@Overridepublic void onError(UiError e) {// TODO Auto-generated method stub}@Overridepublic void onComplete(final Object response) {Message msg = new Message();msg.obj = response;msg.what = 0;mHandler.sendMessage(msg);new Thread() {@Overridepublic void run() {JSONObject json = (JSONObject) response;if (json.has("figureurl")) {Bitmap bitmap = null;try {bitmap = Util.getbitmap(json.getString("figureurl_qq_2"));} catch (JSONException e) {}Message msg = new Message();msg.obj = bitmap;msg.what = 1;mHandler.sendMessage(msg);}}}.start();}@Overridepublic void onCancel() {}};mInfo = new UserInfo(this, mQQAuth.getQQToken());mInfo.getUserInfo(listener);} else {mUserInfo.setText("");mUserInfo.setVisibility(android.view.View.GONE);mUserLogo.setVisibility(android.view.View.GONE);}}Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {if (msg.what == 0) {JSONObject response = (JSONObject) msg.obj;if (response.has("nickname")) {try {mUserInfo.setVisibility(android.view.View.VISIBLE);mUserInfo.setText(response.getString("nickname"));} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}} else if (msg.what == 1) {Bitmap bitmap = (Bitmap) msg.obj;mUserLogo.setImageBitmap(bitmap);mUserLogo.setVisibility(android.view.View.VISIBLE);}}};private void onClickLogin() {if (!mQQAuth.isSessionValid()) {IUiListener listener = new BaseUiListener() {@Overrideprotected void doComplete(JSONObject values) {updateUserInfo();updateLoginButton();}};mQQAuth.login(this, "all", listener);// mTencent.loginWithOEM(this, "all",// listener,"10000144","10000144","xxxx");mTencent.login(this, "all", listener);} else {mQQAuth.logout(this);updateUserInfo();updateLoginButton();}}public static boolean ready(Context context) {if (mQQAuth == null) {return false;}boolean ready = mQQAuth.isSessionValid()&& mQQAuth.getQQToken().getOpenId() != null;if (!ready)Toast.makeText(context, "login and get openId first, please!",Toast.LENGTH_SHORT).show();return ready;}private class BaseUiListener implements IUiListener {@Overridepublic void onComplete(Object response) {Util.showResultDialog(MainActivity.this, response.toString(),"登录成功");doComplete((JSONObject) response);}protected void doComplete(JSONObject values) {}@Overridepublic void onError(UiError e) {Util.toastMessage(MainActivity.this, "onError: " + e.errorDetail);Util.dismissDialog();}@Overridepublic void onCancel() {Util.toastMessage(MainActivity.this, "onCancel: ");Util.dismissDialog();}}class NewClickListener implements OnClickListener {@Overridepublic void onClick(View v) {Context context = v.getContext();Class<?> cls = null;switch (v.getId()) {case R.id.new_login_btn:onClickLogin();return;}if (cls != null) {Intent intent = new Intent(context, cls);context.startActivity(intent);}}}}

3)MainActivity的布局文件如下:

 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical"    android:paddingBottom="25dp"    android:paddingLeft="10dp"    android:paddingRight="10dp"    android:paddingTop="25dp" >    <ScrollView        android:layout_width="match_parent"        android:layout_height="match_parent" >        <LinearLayout            android:id="@+id/main_container"            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:orientation="vertical" >            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:orientation="horizontal" >                <ImageView                    android:id="@+id/user_logo"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:visibility="gone" />                <TextView                    android:id="@+id/user_nickname"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:textColor="#80505050"                    android:textSize="18sp"                    android:visibility="gone" />            </LinearLayout>            <Button                android:id="@+id/new_login_btn"                android:layout_width="match_parent"                android:layout_height="wrap_content" />        </LinearLayout>    </ScrollView></LinearLayout>

4)在strings.xml文件中加入:

    <string name="qq_login">登录</string>    <string name="qq_logout">退出当前账号</string>


 

5)最后一步配置AndroidManifest.xml文件的信息:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.qqloginsample"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" />    <uses-permission android:name="android.permission.INTERNET" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <!-- SDK2.1新增获取用户位置信息 -->    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    <uses-permission android:name="android.permission.READ_PHONE_STATE" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name=".MainActivity"            android:screenOrientation="portrait"            >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity            android:name="com.tencent.connect.common.AssistActivity"            android:configChanges="orientation|keyboardHidden"            android:screenOrientation="portrait"            android:theme="@android:style/Theme.Translucent.NoTitleBar" />        <activity            android:name=".ReturnActivity"             >        </activity>        <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="tencent222222" /> <!-- 100380359 100381104 222222 -->            </intent-filter>        </activity>           </application></manifest>

 

到此,QQ授权登录就完成了。其实就是对SDK中demo的提取,SDK的demo里面功能有点多,可能我们的APP只用到其中的一个或几个,所以当用到里面的某个功能的时候就直接看一下demo,然后提取一下即可。

源码下载地址:http://download.csdn.net/download/wjwj1203/7511671

0 1
原创粉丝点击