文档章节

Android实现QQ第三方登录

____追梦人
 ____追梦人
发布于 2015/06/06 19:03
字数 1261
阅读 1013
收藏 4

先看下效果图吧

\\\\\

原理:我们要使用QQ登录我们的应用,不是不用注册,是我们在后台为用户注册了,但是用户不知道,注册需要唯一标识,上图的那串字母与数字的组合就是我们要获得的唯一标识:OpenID。

\

其中,AppConstant中是用来放置APPID的,由于考虑到还可能引入其他第三方登录,为方便管理,故创建此类。Util是根据路径从网上获取图片的处理类。

首先在AndroidManifest.xml中进行两个定义:

        <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="tencent1104613941" />
            </intent-filter>
        </activity>

然后是两个权限:

<uses-permission android:name="android.permission.INTERNET">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">
接下来是布局文件,activity_main.xml登录按钮,获取头像、昵称、openid的textview:

<linearlayout xmlns:android=" http://schemas.android.com/apk/res/android"xmlns:tools=" http://schemas.android.com/tools"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical">
    <button android:id="@+id/login"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="登录">
    <imageview android:id="@+id/user_logo"android:layout_width="wrap_content"android:layout_height="wrap_content">
    <textview android:id="@+id/user_nickname"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textcolor="#80505050"android:textsize="18sp">
    <textview android:id="@+id/user_openid"android:layout_width="wrap_content"android:layout_height="wrap_content">
    
 
</textview></textview></imageview></button></linearlayout>
然后是MainActivity:
public class MainActivity extends Activity implements OnClickListener {
    TextView openidTextView;
    TextView nicknameTextView;
    Button loginButton;
    ImageView userlogo;
    private Tencent mTencent;
    public static QQAuth mQQAuth;
      public static String mAppid;
      public static String openidString;
      public static String nicknameString;
      public static String TAG="MainActivity";
      Bitmap bitmap = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //用来登录的Button
        loginButton=(Button)findViewById(R.id.login);
        loginButton.setOnClickListener(this);
        //用来显示OpenID的textView
        openidTextView=(TextView)findViewById(R.id.user_openid);
        //用来显示昵称的textview
        nicknameTextView=(TextView)findViewById(R.id.user_nickname);
       //用来显示头像的Imageview
        userlogo=(ImageView)findViewById(R.id.user_logo);
         
    }
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.login:
            LoginQQ();
            break;
 
        default:
            break;
        }
    }
    //这里是调用QQ登录的关键代码
    public void LoginQQ() {
        //这里的APP_ID请换成你应用申请的APP_ID,我这里使用的是DEMO中官方提供的测试APP_ID 222222
        mAppid = AppConstant.APP_ID;
        //第一个参数就是上面所说的申请的APPID,第二个是全局的Context上下文,这句话实现了调用QQ登录
        mTencent = Tencent.createInstance(mAppid,getApplicationContext());
        /**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限 
        官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”  
        第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */
        mTencent.login(MainActivity.this,"all", new BaseUiListener());
             
    }
    /**当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法,
     * onComplete  onCancel onError 
     *分别表示第三方登录成功,取消 ,错误。*/
    private class BaseUiListener implements IUiListener {
 
        public void onCancel() {
            // TODO Auto-generated method stub
             
        }
        public void onComplete(Object response) {
            // TODO Auto-generated method stub
            Toast.makeText(getApplicationContext(), "登录成功", 0).show();
            try {
                //获得的数据是JSON格式的,获得你想获得的内容
                //如果你不知道你能获得什么,看一下下面的LOG
                Log.e(TAG, "-------------"+response.toString());
                openidString = ((JSONObject) response).getString("openid");
                openidTextView.setText(openidString);
                Log.e(TAG, "-------------"+openidString);
                //access_token= ((JSONObject) response).getString("access_token");              //expires_in = ((JSONObject) response).getString("expires_in");
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            /**到此已经获得OpneID以及其他你想获得的内容了
            QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办? 
            sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息 
            如何得到这个UserInfo类呢?  */
            QQToken qqToken = mTencent.getQQToken();
            UserInfo info = new UserInfo(getApplicationContext(), qqToken);
            //这样我们就拿到这个类了,之后的操作就跟上面的一样了,同样是解析JSON    
     info.getUserInfo(new IUiListener() {
 
                public void onComplete(final Object response) {
                    // TODO Auto-generated method stub
                    Log.e(TAG, "---------------111111");
                    Message msg = new Message();
                    msg.obj = response;
                    msg.what = 0;
                    mHandler.sendMessage(msg);
                    Log.e(TAG, "-----111---"+response.toString());
                    /**由于图片需要下载所以这里使用了线程,如果是想获得其他文字信息直接
                     * 在mHandler里进行操作
                     * 
                     */
                    new Thread(){
 
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            JSONObject json = (JSONObject)response;
                            try {
                                bitmap = Util.getbitmap(json.getString("figureurl_qq_2"));
                            } catch (JSONException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                            Message msg = new Message();
                            msg.obj = bitmap;
                            msg.what = 1;
                            mHandler.sendMessage(msg);
                        }                       
                    }.start();
                }               
                public void onCancel() {
                    Log.e(TAG, "--------------111112");
                    // TODO Auto-generated method stub                  
                }
                public void onError(UiError arg0) {
                    // TODO Auto-generated method stub
                    Log.e(TAG, "-111113"+":"+arg0);
                }
                 
            });
             
        }
 
        public void onError(UiError arg0) {
            // TODO Auto-generated method stub
             
        }           
         
    }
    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");
                         
                        nicknameTextView.setText(nicknameString);
                        Log.e(TAG, "--"+nicknameString);
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }else if(msg.what == 1){
                Bitmap bitmap = (Bitmap)msg.obj;
                userlogo.setImageBitmap(bitmap);
                 
            }
        }
 
    };
 
     
}

\

上图是登录Q的返回LOG

\

然后是AppConstant.java:

publicclassAppConstant {
    publicstaticString APP_ID="222222";
}



然后是Util.java
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;
    }
}




至此全部代码就在这里了,我们获得了OpenID这个唯一标识最关键的东西,然后看项目中需要登录的接口还需要什么信息,获取到就能实现登陆了


© 著作权归作者所有

____追梦人
粉丝 18
博文 123
码字总数 21429
作品 0
青岛
Android工程师
私信 提问
Android使用友盟集成QQ、微信、微博等第三方登录

前言 最近项目需要加入第三方分享和登录功能,之前其他项目的第三方分享和登录一直都使用ShareSDK实现的。为了统一使用友盟的全家桶,所以三方分享和登录也就选择了友盟。这里记录一下完整的...

慕前端7069444
2018/05/21
0
0
实现QQ登录第三方APP(Android)

首先你需要到腾讯开放平台注册开发者账号,并创建一个APP,填写包名,获取APP ID: http://open.qq.com/ 完成上面的工作后,可以继续了。 下载Android SDK,SDK提供了使用QQ众多功能的接口。...

crazymus
2015/11/02
7.6K
0
书旗小说 Flutter 版 - flutter_shuqi

高仿书旗小说 Flutter版,支持iOS/Android 高仿书旗小说 Flutter 版 Github地址 screen shot for iOS screen shot for Android 简介 这是一个用Flutter写的书旗小说客户端。 主要实现的功能有...

匿名
01/17
2.7K
0
Phonegap各类商业插件

【Phonegap商业插件服务】[目前插件已经支持到Phonegap最新版本] 1.phonegap-百度社会化分享-andriod插件 v2.0 【该插件支持微信分享和朋友圈分享,qq好友分享,微博分享】 2.phonegap百度社...

夜澜小雨
2015/07/15
1K
0
关于Android客户端qq 互联登录问题

公司有一个网站,web应用使用了qq互联的接口,实现了qq三方登录功能,现在做了一个Android应用(就叫appA)吧,在qq互联的管理平台创建了移动应用,由于使用的是和web应用的相同appid,所以也能实现三...

老鼠盘根
2014/09/10
201
1

没有更多内容

加载失败,请刷新页面

加载更多

001-ELKStack之Elasticearch

ELKStack 之 Elasticsearch ELK Stack 是 Elasticsearch、Logstash、Kibana 三个开源软件的组合。在实时数据检索和分析场合,三者通常是配合共用,而且又都先后归于 Elastic.co 公司名下,故...

伟大源于勇敢的开始
23分钟前
3
0
Kotlin基础语法学习

安装好安卓studio,以及插件支持Kotlin 就可以在创建项目的时候选择 Kotlin语言了。 https://www.jianshu.com/p/4ab13691d681 参考手册: https://www.runoob.com/kotlin/otlin-android-setu...

T型人才追梦者
今天
6
0
java实现简单计算器

1.概述 之前作者写过一篇文章,也是关于计算器的,用的是C++与Qt,链接在这里 这次用java的swing写的(这差距好像有点大,好吧是qt太强了). 先上图: 2.UI 总体布局使用流布局. (1)文本框 文本框就...

Blueeeeeee
今天
9
0
纯CSS实现DIV悬浮(固定位置)

纯CSS实现的DIV悬浮效果(固定位置),兼容常用的浏览器:IE8、360、FireFox、Chrome、Safari、Opera、傲游、搜狗、世界之窗等。效果如下: 实现代码: <!DOCTYPE html> <html> <head> <meta ...

独钓渔
今天
6
0
OSChina 周二乱弹 —— 给我来个女菩萨

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @这次装个文艺青年吧 :#今日歌曲推荐#分享XXXTENTACION/Travis Barker的单曲《Pain = BESTFRIEND》: 《Pain = BESTFRIEND》- XXXTENTACION/...

小小编辑
今天
181
4

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部