写在前面

本篇博客主要讲述利用ShareSDK实现一些简单的第三方登陆,以及分享的功能

叙述

就目前而言,很多的APP都支持第三方登录,例如微信登录,QQ登录,微博登陆等等,省去了用户注册的时间,增强了用户体验。
本次以实现QQ的登录以及QQ的分享为例。

配置sdk

  • 1.首先去ShareSDK官方下载一个ShareSDK
    SDK包具体地址为:http://www.mob.com/downloadDetail/ShareSDK/android 点击SDK下载即可,下载前会提示选择集成自己需要的第三方登录平台。
    在下载完成的文件夹中目录结构如下:
  • 2.选择配置QuickIntegrater.jar
    双击QuickIntegrater.jar会弹出以下窗口,点击确定即可

在当前文件夹会生成一个Sample的文件夹,双击打开将文件夹内的内容全部复制到你的项目旗下即可。
注:不要忘记将libs旗下的jar包Add引用一下。

  • 3.配置项目权限
<!-- 添加必要的权限 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />l
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
  • 4.添加以下activity的注册
<!-- ShareSDK的activity -->
<activity
android:name="com.mob.tools.MobUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize">
   <intent-filter>
    <data android:scheme="tencent100371282" />
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
  <!-- 调用新浪原生SDK,需要注册的回调activity -->
<intent-filter>
    <action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<!--集成line客户端登录授权,需要添如下格式的过滤器-->
<intent-filter>
    <data android:scheme="line.1477692153" />
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.DEFAULT" />
</activity>
<activity
android:name="sharesdk.demo.wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
<!-- 填写您从Mob开发者后台中得到的Appkey和AppSecret -->
<meta-data
android:name="Mob-AppKey"
android:value="你的key" />
<meta-data
android:name="Mob-AppSecret"
android:value="你的AppSecret" />

注:以上的key和AppSecret均要填你在ShareSDK官网申请的串。以上配置基本完成。

接下来是你们最喜欢的撸代码环节

如果你想实现第三方登录,实际上有两种方式

一:只是实现授权,并不需要第三方平台的用户数据;

二:不只是授权,还需要获取第三方平台的数据,这种情况一般是自己有独立的账户系统,需要拿到数据进行注册或者标注处理。

第一种撸法:

  • 1.用户触发第三方登录事件
  • 2.调用platform.getDb().getUserId()请求用户在此平台上的ID
  • 3.如果用户ID存在,则认为用户是合法用户,允许进入系统;否则调用authorize()
  • 4.authorize()方法将引导用户在授权页面输入帐号密码,然后目标平台将验证此用户
  • 5.如果onComplete()方法被回调,表示授权成功,引导用户进入系统
  • 6.否则提示错误,调用removeAccount(true)方法,删除可能的授权缓存数据具体实现为下:
public void shouquan() {
    Platform weibo = ShareSDK.getPlatform(QQ.NAME);
//回调信息,可以在这里获取基本的授权返回的信息,但是注意如果做提示和UI操作要传到主线程handler里去执行
    weibo.setPlatformActionListener(new PlatformActionListener() {

        @Override
        public void onError(Platform arg0, int arg1, Throwable arg2) {
            // TODO Auto-generated method stub
            arg2.printStackTrace();
        }

        @Override
        public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) {
//此时代表成功

        }

        @Override
        public void onCancel(Platform arg0, int arg1) {
            // TODO Auto-generated method stub

        }
    });

    weibo.authorize();//单独授权,OnComplete返回的hashmap是空的
  }

第二种撸法:

  • 1.用户触发第三方登录事件
  • 2.showUser(null)请求授权用户的资料(这个过程中可能涉及授权操作)
  • 3.如果onComplete()方法被回调,将其参数Hashmap代入你应用的Login流程
  • 4.否则提示错误,调用removeAccount(true)方法,删除可能的授权缓存数据
  • 5.Login时客户端发送用户资料中的用户ID给服务端
  • 6.服务端判定用户是已注册用户,则引导用户进入系统,否则返回特定错误码
  • 7.客户端收到“未注册用户”错误码以后,代入用户资料到你应用的Register流程
  • 8.Register时在用户资料中挑选你应用的注册所需字段,并提交服务端注册
  • 9.服务端完成用户注册,成功则反馈客户端引导用户进入系统
  • 10.否则提示错误,调用removeAccount(true)方法,删除可能的授权缓存数据
public void shouquan() {
    Platform weibo = ShareSDK.getPlatform(QQ.NAME);
//回调信息,可以在这里获取基本的授权返回的信息,但是注意如果做提示和UI操作要传到主线程handler里去执行
    weibo.setPlatformActionListener(new PlatformActionListener() {

        @Override
        public void onError(Platform arg0, int arg1, Throwable arg2) {
            // TODO Auto-generated method stub
            arg2.printStackTrace();
        }

        @Override
        public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) {
            // TODO Auto-generated method stub
            arg0.getDb().exportData();
            //遍历Map
            Iterator ite = arg2.entrySet().iterator();
            String str = "";
            while (ite.hasNext()) {
                Map.Entry entry = (Map.Entry) ite.next();
                Object key = entry.getKey();
                Object value = entry.getValue();
                str += key + ": " + value+"\n";
//                    System.out.println(key + ": " + value);
            }
            Toast.makeText(MainActivity.this, str, 1500).show();
            //输出所有授权信息
//                arg0.getDb().exportData();
        }

        @Override
        public void onCancel(Platform arg0, int arg1) {
            // TODO Auto-generated method stub

        }
    });

       weibo.showUser(null);//授权并获取用户信息

}

注:以上就实现了QQ的登录操作。但是登录的会提示美的厨房的登陆,如果想更改为你自己app登录,则需要修改assets旗下的ShareSDK.xml,找到对应的平台如果是QQ则需要找到QQ标签将对应的AppKey替换成你自己在QQ平台申请的Key即可;

实现第三方分享:

对于分享来说相对比较简单具体实现看如下代码:

private void showShare() {
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();

// 分享时Notification的图标和文字  2.5.9以后的版本不     调用此方法
//oks.setNotification(R.drawable.ic_launcher, getString(R.string.app_name));
// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
oks.setTitle("标题");
// titleUrl是标题的网络链接,仅在人人网和QQ空间使用
oks.setTitleUrl("http://sharesdk.cn");
// text是分享文本,所有平台都需要这个字段
oks.setText("我是分享文本");
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
oks.setImagePath("/sdcard/test.jpg");//确保SDcard下面存在此张图片
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl("http://sharesdk.cn");
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
oks.setComment("我是测试评论文本");
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(getString(R.string.app_name));
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl("http://sharesdk.cn");

// 启动分享GUI
oks.show(this);
}