写在前面
本篇博客主要讲述利用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); }