Android实现QQ登录(Android Studio开发)

很多人看到这篇博客可能会吐槽,官方不是已经写出开发文档,你在写一个不是照抄么?

由于昨天在开发项目中用到三方登录,以前认为很简单 有官方文档应该开启起来很容易,结果大家肯定猜到了,我用了一下午的时间才将三方登陆勉强完成。本人认为官方文档有些地方写的不清不楚(或者是我理解能力有限)。下两篇博客我将写一下微信、新浪微博登陆。

先放置效果图
这里写图片描述

1、我们应该下载腾讯官方的SDK

下载地址:http://wiki.open.qq.com/wiki/mobile/SDK下载
下载完之后里面还有Sample例子,基础比较好同学可以尝试观看一下。

2、Android Studio环境配置

首先我们先创建一个Android工程,将下载解压的中的jar文件全部拷贝到libs目录下,不要忘记右键Add as Library,
在AndroidManifest中添加必要的数据
权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在application节点中添加

<activity
android:name="com.tencent.tauth.AuthActivity" 
android:noHistory="true" 
android:launchMode="singleTask" >
<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" />
</intent-filter>
</activity>

如果您下载的版本为SDK_V2.0以上的还需要添加

<activity 
android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="orientation|keyboardHidden|screenSize" 
/>

其中APPId为用户在腾讯开放平台创建App,系统给你分配的。我使用的是腾讯测试的APPId这个比较简单就不详细说了,不会的留言或者私信。

3、Activity的逻辑编写

如果上面环境配置成功,下面开始实现逻辑,首先展示一下我的布局,比较简单就一个简单的Button

 <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.lx.qqlogin.MainActivity">

    <ImageView
        android:id="@+id/iv_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:src="@mipmap/ic_launcher"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="login"
        android:text="登 录"/>

    <TextView
        android:id="@+id/tv_result"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
</LinearLayout>

MainActivity中的代码如下;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private Tencent mTencent;
    private TextView mTvResult;
    private ImageView mIvIcon;
    private Context mContext;
    private String nicknameString;
    private String openidString;
    private Bitmap bitmap;
    private String APP_ID = "222222";


    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 0) {
                JSONObject response = (JSONObject) msg.obj;
                if (response.has("nickname")) {
                    try {
                        nicknameString = response.getString("nickname");
                        mTvResult.setText("QQ名:" + nicknameString);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            } else if (msg.what == 1) {
                Bitmap bitmap = (Bitmap) msg.obj;
                mIvIcon.setImageBitmap(bitmap);
            }
        }
    };
    private Button mBtn_login;
    private Button mBtn_logout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mContext = this;
        initUI();
    }

    /**
     * 初始化UI控件
     */
    private void initUI() {
        mTvResult = (TextView) findViewById(R.id.tv_result);
        mIvIcon = (ImageView) findViewById(R.id.iv_icon);
    }

    //按钮的点击事件
    public void login(View view) {
        mTencent = Tencent.createInstance(APP_ID, mContext);
        mTencent.login(this, "all", new BaseUiListener());
    }

    /**
     * 当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法,
     * onComplete  onCancel onError
     * 分别表示第三方登录成功,取消 ,错误。
     */
    private class BaseUiListener implements IUiListener {

        public void onCancel() {
        }

        public void onComplete(Object response) {
            try {
                //获得的数据是JSON格式的,获得你想获得的内容
                //如果你不知道你能获得什么,看一下下面的LOG
                openidString = ((JSONObject) response).getString("openid");
            } catch (JSONException e) {
                e.printStackTrace();
            }
            /**到此已经获得OpneID以及其他你想获得的内容了
             QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?
             sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息
             如何得到这个UserInfo类呢?  */
            QQToken qqToken = mTencent.getQQToken();
            UserInfo info = new UserInfo(mContext, qqToken);
            //这样我们就拿到这个类了,之后的操作就跟上面的一样了,同样是解析JSON
            info.getUserInfo(new IUiListener() {
                public void onComplete(final Object response) {
                    mHandler.obtainMessage(0, response).sendToTarget();
                    /**由于图片需要下载所以这里使用了线程,如果是想获得其他文字信息直接在mHandler里进行操作*/
                    new Thread() {
                        @Override
                        public void run() {

                            JSONObject json = (JSONObject) response;
                            Log.e(TAG, json.toString());
                            try {
                                bitmap = Util.getbitmap(json.getString("figureurl_qq_2"));
                            } catch (JSONException e) {
                                e.printStackTrace();
                            }
                            mHandler.obtainMessage(1, bitmap).sendToTarget();
                        }
                    }.start();
                }

                @Override
                public void onError(UiError uiError) {

                }

                public void onCancel() {

                }
            });
        }

        public void onError(UiError arg0) {
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Tencent.onActivityResultData(requestCode, resultCode, data, new BaseUiListener());
    }
}
4、利用Util获取用户QQ的头像,使用的是HttpURLConnection,你们也可以使用Xutils、OkHttp等。Util代码如下:
public class Util {
    public static String TAG = "UTIL";

    public static Bitmap getbitmap(String imageUri) {
        Log.v(TAG, "getbitmap:" + imageUri);
        // 显示网络上的图片
        Bitmap bitmap = null;
        try {
            URL myFileUrl = new URL(imageUri);
            HttpURLConnection conn = (HttpURLConnection) myFileUrl
                    .openConnection();
            conn.setDoInput(true);
            conn.connect();
            InputStream is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
            is.close();

            Log.v(TAG, "image download finished." + imageUri);
        } catch (IOException e) {
            e.printStackTrace();
            Log.v(TAG, "getbitmap bmp fail---");
            return null;
        }
        return bitmap;
    }
}

看到这里已经接近尾声。 如果有任何疑问或者本人哪里出现错误,请大家指出,你们的支持是我最大动力,谢谢您的观看。

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值