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
- Android开发全程记录(四)——使用QQ登陆第三方应用
- Android开发全程记录(九)——使用新浪微博登录第三方应用
- android QQ账号登陆第三方应用
- android QQ 第三方登陆
- iOS 第三方登陆 —— QQ
- iOS 第三方登陆 —— QQ
- android 使用sharesdk完成微信、QQ第三方登陆
- java qq号登陆第三方应用
- Android端 第三方qq登陆
- php使用qq第三方登陆(oauth协议)
- QQ第三方登陆
- QQ第三方登陆
- 第三方qq登陆
- 第三方QQ登陆
- qq第三方登陆
- QQ第三方登陆
- Android应用开发使用第三方字体
- web开发第三方登陆之QQ登陆
- 黑马程序员_C中几个位运算符的灵活运用
- UIViewAdditions(一个很方便使用的工具类吧)
- tomcat 域名配置
- Spring定时任务的几种实现
- sql_profile固定执行计划
- Android开发全程记录(四)——使用QQ登陆第三方应用
- 数据库:关于第三范式
- JDK+tomcat的开发环境的配置
- Tomcat多实例部署
- jsp 基础语法
- Oracle 物化视图 说明
- UVA-113- Power of Cryptography
- mongodb常用语句
- JVM分代垃圾回收策略的基础概念