您的位置:首页 > 其它

QQ第三方登录

2017-06-16 13:21 323 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。

使用的sdk版本:  V2.2.2(发布日期:2014.3.17)

因为,开发SDK的版本更新比较快,阅读的童鞋注意点吧。

开工前期的准备:

        1.建议你首先去下载最新的SDK,那里面除了有案例外,还有必须的jar包。

         2.最好在qq的开发平台自己注册个账号,那样移植起来更容易点。

给个链接吧:

        下载

配置清单:

       1.添加权限:

[html] view
plain copy

 print?

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

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

      2.添加活动:

[html] view
plain copy

 print?

<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>  

        <activity  

            android:name="com.tencent.connect.common.AssistActivity"  

            android:screenOrientation="portrait"  

            android:theme="@android:style/Theme.Translucent.NoTitleBar" />  

      在tencent后面添加自己的应用id,222222是腾讯给的专用测试id。

顺便提醒一句,在这个版本中要导入两个jar包。

布局:

[html] view
plain copy

 print?

<?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

    android:layout_width="match_parent"  

    android:layout_height="match_parent"  

    android:orientation="vertical" >  

  

    <TextView  

        android:id="@+id/user_nickname"  

        android:layout_width="wrap_content"  

        android:layout_height="wrap_content"  

        android:text="昵称" />  

  

    <ImageView  

        android:id="@+id/user_logo"  

        android:layout_width="wrap_content"  

        android:layout_height="wrap_content" />  

  

    <Button  

        android:id="@+id/new_login_btn"  

        android:layout_width="match_parent"  

        android:layout_height="wrap_content"  

        android:text="登录" />  

  

    <TextView  

        android:id="@+id/user_callback"  

        android:layout_width="wrap_content"  

        android:layout_height="wrap_content"  

        android:text="返回消息" />  

活动的详细代码:

[html] view
plain copy

 print?

/**  

 * 测试qq第三方登录功能  

 *   

 */  

public class TestQQ extends Activity implements OnClickListener {  

    private TextView mUserInfo;  

    private ImageView mUserLogo;  

    private Button mNewLoginButton;  

    private TextView backInfo;  

  

    private UserInfo mInfo;  

    private Tencent mTencent;  

    public QQAuth mQQAuth;  

    // 申请的id  

    public String mAppid = "222222";  

  

    @Override  

    protected void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.acy_testqq);  

        initView();  

    }  

  

    public void initView() {  

        mUserInfo = (TextView) findViewById(R.id.user_nickname);  

        mUserLogo = (ImageView) findViewById(R.id.user_logo);  

        mNewLoginButton = (Button) findViewById(R.id.new_login_btn);  

        mNewLoginButton.setOnClickListener(this);  

        backInfo = (TextView) findViewById(R.id.user_callback);  

        // Tencent类是SDK的主要实现类,通过此访问腾讯开放的OpenAPI。  

        mQQAuth = QQAuth.createInstance(mAppid, this.getApplicationContext());  

        // 实例化  

        mTencent = Tencent.createInstance(mAppid, this);  

    }  

  

    Handler mHandler = new Handler() {  

  

        @Override  

        public void handleMessage(Message msg) {  

            if (msg.what == 0) {  

                mUserInfo.setVisibility(android.view.View.VISIBLE);  

                mUserInfo.setText(msg.getData().getString("nickname"));  

            } else if (msg.what == 1) {  

                Bitmap bitmap = (Bitmap) msg.obj;  

                mUserLogo.setImageBitmap(bitmap);  

                mUserLogo.setVisibility(android.view.View.VISIBLE);  

            }  

        }  

    };  

  

    private void updateUserInfo() {  

        if (mQQAuth != null && mQQAuth.isSessionValid()) {  

            IUiListener listener = new IUiListener() {  

                @Override  

                public void onError(UiError e) {  

                    // TODO Auto-generated method stub  

                }  

  

                @Override  

                public void onComplete(final Object response) {  

                    JSONObject json = (JSONObject) response;  

                    // 昵称  

                    Message msg = new Message();  

                    String nickname = null;  

                    try {  

                        nickname = ((JSONObject) response)  

                                .getString("nickname");  

                    } catch (JSONException e) {  

                        // TODO Auto-generated catch block  

                        e.printStackTrace();  

                    }  

                    msg.getData().putString("nickname", nickname);  

                    msg.what = 0;  

                    mHandler.sendMessage(msg);  

                    // 头像  

                    String path;  

                    try {  

                        path = json.getString("figureurl_qq_2");  

                        MyImgThread imgThread = new MyImgThread(path);  

                        Thread thread = new Thread(imgThread);  

                        thread.start();  

                    } catch (JSONException e1) {  

                        // TODO Auto-generated catch block  

                        e1.printStackTrace();  

                    }  

                }  

  

                @Override  

                public void onCancel() {  

                    // TODO Auto-generated method stub  

  

                }  

            };  

            // MainActivity.mTencent.requestAsync(Constants.GRAPH_SIMPLE_USER_INFO,  

            // null,  

            // Constants.HTTP_GET, requestListener, null);  

            mInfo = new UserInfo(this, mQQAuth.getQQToken());  

            mInfo.getUserInfo(listener);  

  

        } else {  

            // mUserInfo.setText("");  

            // mUserInfo.setVisibility(android.view.View.GONE);  

            // mUserLogo.setVisibility(android.view.View.GONE);  

        }  

    }  

  

    /**  

     * 开启线程 获取头像  

     */  

    class MyImgThread implements Runnable {  

        private String imgPath;  

        private Bitmap bitmap;  

  

        public MyImgThread(String imgpath) {  

            this.imgPath = imgpath;  

        }  

  

        @Override  

        public void run() {  

            // TODO Auto-generated method stub  

            bitmap = getImgBitmap(imgPath);  

            Message msg = new Message();  

            msg.obj = bitmap;  

            msg.what = 1;  

            mHandler.sendMessage(msg);  

        }  

    }  

  

    /**  

     * 根据头像的url 获取bitmap  

     */  

    public Bitmap getImgBitmap(String imageUri) {  

        // 显示网络上的图片  

        Bitmap bitmap = null;  

        HttpURLConnection conn = null;  

        InputStream is = null;  

        try {  

            URL myFileUrl = new URL(imageUri);  

            conn = (HttpURLConnection) myFileUrl.openConnection();  

            conn.setDoInput(true);  

            conn.connect();  

  

            is = conn.getInputStream();  

            bitmap = BitmapFactory.decodeStream(is);  

            is.close();  

        } catch (IOException e) {  

            e.printStackTrace();  

            return null;  

        } finally {  

            try {  

                conn.disconnect();  

                is.close();  

                is.reset();  

            } catch (IOException e) {  

                // TODO Auto-generated catch block  

                e.printStackTrace();  

            }  

        }  

        return bitmap;  

    }  

  

    public void onClickLogin() {  

        // 登录  

        if (!mQQAuth.isSessionValid()) {  

            // 实例化回调接口  

            IUiListener listener = new BaseUiListener() {  

                @Override  

                protected void doComplete(JSONObject values) {  

                    updateUserInfo();  

                    // updateLoginButton();  

                    if (mQQAuth != null) {  

                        mNewLoginButton.setTextColor(Color.BLUE);  

                        mNewLoginButton.setText("登录");  

                    }  

                }  

            };  

            // "all": 所有权限,listener: 回调的实例  

            // mQQAuth.login(this, "all", listener);  

  

            // 这版本登录是使用的这种方式,后面的几个参数是啥意思 我也没查到  

            mTencent.loginWithOEM(this, "all", listener, "10000144",  

                    "10000144", "xxxx");  

        } else {  

            // 注销登录  

            mQQAuth.logout(this);  

            updateUserInfo();  

  

            // updateLoginButton();  

            mNewLoginButton.setTextColor(Color.RED);  

            mNewLoginButton.setText("退出帐号");  

        }  

    }  

  

    /**  

     * 调用SDK封装好的借口,需要传入回调的实例 会返回服务器的消息  

     */  

    private class BaseUiListener implements IUiListener {  

        /**  

         * 成功  

         */  

        @Override  

        public void onComplete(Object response) {  

            backInfo.setText(response.toString());  

            doComplete((JSONObject) response);  

        }  

  

        /**  

         * 处理返回的消息 比如把json转换为对象什么的  

         *   

         * @param values  

         */  

        protected void doComplete(JSONObject values) {  

  

        }  

  

        @Override  

        public void onError(UiError e) {  

            Toast.makeText(TestQQ.this, e.toString(), 1000).show();  

        }  

  

        @Override  

        public void onCancel() {  

            Toast.makeText(TestQQ.this, "cancel", 1000).show();  

        }  

    }  

  

    @Override  

    public void onClick(View v) {  

        // TODO Auto-generated method stub  

        // 当点击登录按钮  

        if (v == mNewLoginButton) {  

            onClickLogin();  

        }  

    }  

  

}  

测试:

        1.运行的开始界面:



       2.当你的手机没用安装qq的时候,会跳转到网页qq注册界面:



       3.如果手机上有qq客户端:



       4.获取成功:



注意:

       1.因为我使用的是腾讯给的测试接口id,如果你也是使用的测试接口的话,那么记得把应用的名字改为: “open_sample”。

       2.在进行登录的时候,可以进行判断是否适合sso登录。

[html] view
plain copy

 print?

// 是否支持sso登录  

            if (mTencent.isSupportSSOLogin(this)) {  

                onClickLogin();  

            }  

当支持的时候,就返回真,否则返回假。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: