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

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

先放置效果图

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

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

2、Android Studio环境配置

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

"android.permission.INTERNET" />"android.permission.ACCESS_NETWORK_STATE" />

在application节点中添加

"com.tencent.tauth.AuthActivity" android:noHistory="true" android:launchMode="singleTask" >"android.intent.action.VIEW" />"android.intent.category.DEFAULT" />"android.intent.category.BROWSABLE" />"tencent222222" />

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

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

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

3、Activity的逻辑编写

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

 "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">    "@+id/iv_icon"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:src="@mipmap/ic_launcher"/>    

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

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

更多相关文章

  1. android 文件下载(一)
  2. 3月份工作回顾
  3. Android(安卓)Okhttp断点续传面试深入解析
  4. 『叫兽学堂』手把手教你如何正确启动Android(安卓)SDK 1.5模拟器
  5. Android系统定制之源码完美下载(一)
  6. android外部存储读写权限问题
  7. Android和iOS应用下载实现合成一个二维码
  8. Android(安卓)版本更新下载自动安装APK,并解决Android6.0安装失败
  9. Android2.0游戏开发实战宝典下载

随机推荐

  1. proguard.cfg 配置文件
  2. android pull解析XML文件
  3. android的textView周围添加图片
  4. mipmap 目录和drawable 目录有什么区别
  5. Android(安卓)一张图理解getWidth和getMe
  6. Android获取应用权限列表
  7. Android(安卓)6.0 相关问题
  8. android中Path类的知识总结
  9. android 页面跳转,数据回传
  10. 在activitygroup中用startActivityForRes