zoukankan      html  css  js  c++  java
  • Android实现QQ第三方登录

    Android实现QQ第三方登录

    作者:  发布日期:2014-09-10 22:26:44
    Tag标签:第三方  
    • Android 实现QQ第三方登录

      在项目中需要实现QQ第三方登录,经过一番努力算是写出来了,现在总结以下,以防以后遗忘,能帮到其他童鞋就更好了。

      首先肯定是去下载SDK和DEMO

      http://wiki.open.qq.com/wiki/mobile/SDK下载

      本文是我自己整合后的简单DEMO。

      先看下效果图吧

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

      跟着代码来说吧。

      首先,我们要加载open_sdk.jar和mta-sdk-1.00.jar这两个架包顺便看下我总共用到的类

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

       

      好了进入主题

      首先在AndroidManifest.xml中进行两个定义如果不定义是不行的

      01.<activity
      02.android:name="com.tencent.tauth.AuthActivity"
      03.android:launchMode="singleTask"
      04.android:noHistory="true" >
      05.<intent-filter>
      06.<action android:name="android.intent.action.VIEW" />
      07. 
      08.<category android:name="android.intent.category.DEFAULT" />
      09.<category android:name="android.intent.category.BROWSABLE" />
      10. 
      11.<data android:scheme="tencent222222" /><!—注意在这里用你的appid替换222222 -->
      12.</intent-filter>
      13.</activity>
      14.<activity android:name="com.tencent.connect.common.AssistActivity"
      15.android:theme="@android:style/Theme.Translucent.NoTitleBar"
      16.android:screenOrientation="portrait"/>

       

      然后是两个权限

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

       

      接下来是布局文件,activity_main.xml登录按钮,获取头像、昵称、openid的textview

      01.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      03.android:layout_width="fill_parent"
      04.android:layout_height="fill_parent"
      05.android:orientation="vertical">
      06.<Button
      07.android:id="@+id/login"
      08.android:layout_width="fill_parent"
      09.android:layout_height="wrap_content"
      10.android:text="登录"/>
      11.<ImageView
      12.android:id="@+id/user_logo"
      13.android:layout_width="wrap_content"
      14.android:layout_height="wrap_content"
      15./>
      16.<TextView
      17.android:id="@+id/user_nickname"
      18.android:layout_width="wrap_content"
      19.android:layout_height="wrap_content"
      20.android:textColor="#80505050"
      21.android:textSize="18sp"
      22./>
      23.<TextView
      24.android:id="@+id/user_openid"
      25.android:layout_width="wrap_content"
      26.android:layout_height="wrap_content" 
      27./>
      28. 
      29.</LinearLayout>

       

      然后是MainActivity

      01.public class MainActivity extends Activity implements OnClickListener {
      02.TextView openidTextView;
      03.TextView nicknameTextView;
      04.Button loginButton;
      05.ImageView userlogo;
      06.private Tencent mTencent;
      07.public static QQAuth mQQAuth;
      08.public static String mAppid;
      09.public static String openidString;
      10.public static String nicknameString;
      11.public static String TAG="MainActivity";
      12.Bitmap bitmap = null;
      13.@Override
      14.public void onCreate(Bundle savedInstanceState) {
      15.super.onCreate(savedInstanceState);
      16.setContentView(R.layout.activity_main);
      17.//用来登录的Button
      18.loginButton=(Button)findViewById(R.id.login);
      19.loginButton.setOnClickListener(this);
      20.//用来显示OpenID的textView
      21.openidTextView=(TextView)findViewById(R.id.user_openid);
      22.//用来显示昵称的textview
      23.nicknameTextView=(TextView)findViewById(R.id.user_nickname);
      24.//用来显示头像的Imageview
      25.userlogo=(ImageView)findViewById(R.id.user_logo);
      26. 
      27.}
      28.public void onClick(View v) {
      29.// TODO Auto-generated method stub
      30.switch (v.getId()) {
      31.case R.id.login:
      32.LoginQQ();
      33.break;
      34. 
      35.default:
      36.break;
      37.}
      38.}
      39.//这里是调用QQ登录的关键代码
      40.public void LoginQQ() {
      41.//这里的APP_ID请换成你应用申请的APP_ID,我这里使用的是DEMO中官方提供的测试APP_ID 222222
      42.mAppid = AppConstant.APP_ID;
      43.//第一个参数就是上面所说的申请的APPID,第二个是全局的Context上下文,这句话实现了调用QQ登录
      44.mTencent = Tencent.createInstance(mAppid,getApplicationContext());
      45./**通过这句代码,SDK实现了QQ的登录,这个方法有三个参数,第一个参数是context上下文,第二个参数SCOPO 是一个String类型的字符串,表示一些权限
      46.官方文档中的说明:应用需要获得哪些API的权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all” 
      47.第三个参数,是一个事件监听器,IUiListener接口的实例,这里用的是该接口的实现类 */
      48.mTencent.login(MainActivity.this,"all"new BaseUiListener());
      49. 
      50.}
      51./**当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法,
      52.* onComplete  onCancel onError
      53.*分别表示第三方登录成功,取消 ,错误。*/
      54.private class BaseUiListener implements IUiListener {
      55. 
      56.public void onCancel() {
      57.// TODO Auto-generated method stub
      58. 
      59.}
      60.public void onComplete(Object response) {
      61.// TODO Auto-generated method stub
      62.Toast.makeText(getApplicationContext(), "登录成功"0).show();
      63.try {
      64.//获得的数据是JSON格式的,获得你想获得的内容
      65.//如果你不知道你能获得什么,看一下下面的LOG
      66.Log.e(TAG, "-------------"+response.toString());
      67.openidString = ((JSONObject) response).getString("openid");
      68.openidTextView.setText(openidString);
      69.Log.e(TAG, "-------------"+openidString);
      70.//access_token= ((JSONObject) response).getString("access_token");              //expires_in = ((JSONObject) response).getString("expires_in");
      71.catch (JSONException e) {
      72.// TODO Auto-generated catch block
      73.e.printStackTrace();
      74.}
      75./**到此已经获得OpneID以及其他你想获得的内容了
      76.QQ登录成功了,我们还想获取一些QQ的基本信息,比如昵称,头像什么的,这个时候怎么办?
      77.sdk给我们提供了一个类UserInfo,这个类中封装了QQ用户的一些信息,我么可以通过这个类拿到这些信息
      78.如何得到这个UserInfo类呢?  */
      79.Q<a href="http://www.it165.net/pro/pkqt/" target="_blank" class="keylink">QT</a>oken qqToken = mTencent.getQ<a href="http://www.it165.net/pro/pkqt/" target="_blank" class="keylink">QT</a>oken();
      80.UserInfo info = new UserInfo(getApplicationContext(), <a href="http://www.it165.net/qq/" target="_blank"class="keylink">qq</a>Token);
      81.//这样我们就拿到这个类了,之后的操作就跟上面的一样了,同样是解析JSON          
      01.info.getUserInfo(new IUiListener() {
      02. 
      03.public void onComplete(final Object response) {
      04.// TODO Auto-generated method stub
      05.Log.e(TAG, "---------------111111");
      06.Message msg = new Message();
      07.msg.obj = response;
      08.msg.what = 0;
      09.mHandler.sendMessage(msg);
      10.Log.e(TAG, "-----111---"+response.toString());
      11./**由于图片需要下载所以这里使用了线程,如果是想获得其他文字信息直接
      12.* 在mHandler里进行操作
      13.*
      14.*/
      15.new Thread(){
      16. 
      17.@Override
      18.public void run() {
      19.// TODO Auto-generated method stub
      20.JSONObject json = (JSONObject)response;
      21.try {
      22.bitmap = Util.getbitmap(json.getString("figureurl_<a href="http://www.it165.net/qq/" target="_blank" class="keylink">qq</a>_2"));
      23.catch (JSONException e) {
      24.// TODO Auto-generated catch block
      25.e.printStackTrace();
      26.}
      27.Message msg = new Message();
      28.msg.obj = bitmap;
      29.msg.what = 1;
      30.mHandler.sendMessage(msg);
      31.}                      
      32.}.start();
      33.}              
      34.public void onCancel() {
      35.Log.e(TAG, "--------------111112");
      36.// TODO Auto-generated method stub                 
      37.}
      38.public void onError(UiError arg0) {
      39.// TODO Auto-generated method stub
      40.Log.e(TAG, "-111113"+":"+arg0);
      41.}
      42. 
      43.});
      44. 
      45.}
      46. 
      47.public void onError(UiError arg0) {
      48.// TODO Auto-generated method stub
      49. 
      50.}          
      51. 
      52.}
      53.Handler mHandler = new Handler() {
      54. 
      55.@Override
      56.public void handleMessage(Message msg) {
      57.if (msg.what == 0) {
      58.JSONObject response = (JSONObject) msg.obj;
      59.if (response.has("nickname")) {
      60.try {
      61.nicknameString=response.getString("nickname");
      62. 
      63.nicknameTextView.setText(nicknameString);
      64.Log.e(TAG, "--"+nicknameString);
      65.catch (JSONException e) {
      66.// TODO Auto-generated catch block
      67.e.printStackTrace();
      68.}
      69.}
      70.}else if(msg.what == 1){
      71.Bitmap bitmap = (Bitmap)msg.obj;
      72.userlogo.setImageBitmap(bitmap);
      73. 
      74.}
      75.}
      76. 
      77.};
      78. 
      79. 
      80.}

      上图是登录Q的返回LOG

      上图是我们获得腾讯提供的UserInfo返回的LOG

      然后是AppConstant.java

      1.public class AppConstant {
      2.public static String APP_ID="222222";
      3.}

      然后是Util.java

      01.public class Util {
      02.public static String TAG="UTIL";
      03.public static Bitmap getbitmap(String imageUri) {
      04.Log.v(TAG, "getbitmap:" + imageUri);
      05.// 显示网络上的图片
      06.Bitmap bitmap = null;
      07.try {
      08.URL myFileUrl = new URL(imageUri);
      09.HttpURLConnection conn = (HttpURLConnection) myFileUrl
      10..openConnection();
      11.conn.setDoInput(true);
      12.conn.connect();
      13.InputStream is = conn.getInputStream();
      14.bitmap = BitmapFactory.decodeStream(is);
      15.is.close();
      16. 
      17.Log.v(TAG, "image download finished." + imageUri);
      18.catch (IOException e) {
      19.e.printStackTrace();
      20.Log.v(TAG, "getbitmap bmp fail---");
      21.return null;
      22.}
      23.return bitmap;
      24.}
      25.}

       

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

      得意结束。

       






  • 相关阅读:
    实验三 进程调度模拟程序
    实验二作业调度模拟程序
    最新广商小助手 项目进展 OpenGL ES 3D在我项目中引用 代码太多只好选重要部分出来
    最后冲刺 我的项目 广商小助手
    最新一课 老师指点用Listview适配器
    安卓小学生四则运算
    大三上学期安卓一边学一边开始做一个自己觉得可以的项目 广商小助手App 加油
    我要再接再力 学更多
    用场景来规划测试工作
    阅读第13,14,15,16,17章
  • 原文地址:https://www.cnblogs.com/Jxiaobai/p/6617531.html
Copyright © 2011-2022 走看看