现在国内大部分APP应用都集成了第三方登录和社会化分享,主要都是为了方便用户使用软件的同时又宣传推广应用。而市面上大多数的主流的软件都开放了第三方登录和社会化分享,假如每一个平台都一个一个地去集成,可能就太消耗时间和加大了工作量,好在这种登录和分享功能已经有第三方平台帮我们做好了,我们直接调用其SDK即可。国内用的比较多的就是Mob和友盟,这里我们以mob为例。
首先官网地址是:http://www.mob.com/
当然只有注册了用户,才可以创建应用,使用第Mob平台提供的第三方登录和社会化分享工具。好了不废话,进入正题。
第一步登录官网首页
点击右侧头像栏那里,选择进入后台,选择ShareSDK,立即使用并创建名为MobShareSDKDemo的Android应用。
获取创建应用成功后的APP Key和 APP Secret。
点击下方链接下载SDK。
http://www.mob.com/#/downloadDetail/ShareSDK/android
这里我们以QQ,微信,新浪微博为例,仅需要下载相对应的集成文档即可。
下载完成后是一个压缩包,解压之后有两个文件夹,一个是ShareSDK for android ApiDoc,顾名思义就是一个api文档。另外一个是ShareSDK for Android,这里我们打开这个文件夹,这里面包含分享的源码和所需要的资源文件和jar包。如下图:
第二步去各大社交平台继续注册应用
这里我们以QQ,微信,微博为例,所以需要到相应的开发平台进行注册,跟Mob平台同一个道理,只有注册完之后才能进行py交易,欧不,是进行第三方平台登录和社会化分享。
1.腾讯开放平台
申请地址: http://open.qq.com/
如果没有在腾讯开放平台注册过开发者信息,需要先注册完后,待开发者信息审核通过,我们实际项目应用才能上线。否则会受到腾讯平台的限制。以下微信,微博同理。
来到开放平台首页,找到“应用接入”—>”创建移动应用”—>“移动应用 安卓”—>创建应用后“完善信息”—>保存腾讯开放平台提供给我们的APP ID和APP KEY
应用信息填写完整,这里我们仅仅是演示demo,把有的信息填上去即可,没有的不填也没有关系,最后保存应用信息。然后点击“管理中心”来到管理中心页面,找到未上线的项目MobShareSDKDemo,点进去,进入我们Demo的详情页。由于这里我们需要做到QQ登录,所以我们需要在基础服务那一栏里找到“QQ登录”,添加应用调试者信息。其实说白了就是添加几个qq号码,在调试的时候可以使用。
2.微信开放平台
申请地址: https://open.weixin.qq.com/
来到微信开放平台首页,在标题栏找到“管理中心”—>”创建移动应用”—>“填写基本信息”—>“填写平台信息”
※ 这里需要注意的是应用签名这一栏,在实际项目开发过程中,应用签名需要先使用签名文件生成apk包安装到手机上,再根据签名生成工具获得应用签名。
studio如何生成签名文件,可以戳下面这个链接:
Android Studio生成签名工具,自动签名,以及生成SHA1和MD5的值
下载签名生成工具请戳下面这个链接:
https://open.weixin.qq.com/zh_CN/htmledition/res/dev/download/sdk/Gen_Signature_Android.apk
最后得到的应用签名如下,填写完信息,微信需要审核,审核时间为7天左右,但实际审核一般几天就能通过,不过在实际开发过程中,最好还是提前申请注册应用信息。
3.新浪微博开放平台
申请地址:http://open.weibo.com/
来到新浪微博开放平台首页,在找到“移动应用”—>”立即接入”—>“创建新应用”—>填写完应用名称,选择Android平台即可
在应用信息中“基本信息”可以找到我们需要接下来填入到ShareSDK.xml中的App Key、App Secret
※ 这里需要注意的是我们需要在“高级信息”中填写OAuth2.0 授权设置回调地址。否则会报一个redirect_uri_mismatch的错误信息
※ 同时要注意的是我们需要在“基本信息”中编辑应用基本信息。我们可以填3套对应包名签名应用信息。这里,包名都一样(com.donkor.demo.mobsharesdk),我们填写两套Android签名即可,一个根据debug.apk安装上去根据包名获取。一个根据对应的签名文件安装到手机上的release.apk获得。第一个是方便我们在调试的过程中测试,第二个则是方便我们项目上线时使用。新浪微博要求的其他应用基本信息必须填写的,根据要求把他填写完整,保存即可。
※ 应用信息没有提交审核。想要测试的话,还需要添加测试账号信息。否则会报一个号码403的 applications over the unaudited use restrictions!错误。
文件不存在(C8998)的错误,同样经常出现。原因可能是台上的包名和签名与应用的不相同,或者是OAuth2.0授权设置中设置你的回调地址与应用内调用的不同。
第三步配置信息与使用
1.打开studio新建MobShareSDKDemo的项目
2.依赖所需要的jar包和新建一个assets文件夹放入ShareSDK.xml
3.将上面下载下来,解压出来的SDK中ShareSDK for Android\Libs\OneKeyShare\src目录下的源码直接拷贝到项目中
4.这里由于使用到了微信,所以需要新建wxapi目录再放置WXEntryActivity(这里的目录名和类名必须遵从微信的要求)
WXEntryActivity.Java的代码如下:
package com.donkor.demo.mobsharesdk.wxapi;
import android.content.Intent;
import android.widget.Toast;
import cn.sharesdk.wechat.utils.WXAppExtendObject;
import cn.sharesdk.wechat.utils.WXMediaMessage;
import cn.sharesdk.wechat.utils.WechatHandlerActivity;
/** 微信客户端回调activity示例 */
public class WXEntryActivity extends WechatHandlerActivity {
/**
* 处理微信发出的向第三方应用请求app message
* <p>
* 在微信客户端中的聊天页面有“添加工具”,可以将本应用的图标添加到其中
* 此后点击图标,下面的代码会被执行。Demo仅仅只是打开自己而已,但你可
* 做点其他的事情,包括根本不打开任何页面
*/
public void onGetMessageFromWXReq(WXMediaMessage msg) {
if (msg != null) {
Intent iLaunchMyself = getPackageManager().getLaunchIntentForPackage(getPackageName());
startActivity(iLaunchMyself);
}
}
/**
* 处理微信向第三方应用发起的消息
* <p>
* 此处用来接收从微信发送过来的消息,比方说本demo在wechatpage里面分享
* 应用时可以不分享应用文件,而分享一段应用的自定义信息。接受方的微信
* 客户端会通过这个方法,将这个信息发送回接收方手机上的本demo中,当作
* 回调。
* <p>
* 本Demo只是将信息展示出来,但你可做点其他的事情,而不仅仅只是Toast
*/
public void onShowMessageFromWXReq(WXMediaMessage msg) {
if (msg != null && msg.mediaObject != null
&& (msg.mediaObject instanceof WXAppExtendObject)) {
WXAppExtendObject obj = (WXAppExtendObject) msg.mediaObject;
Toast.makeText(this, obj.extInfo, Toast.LENGTH_SHORT).show();
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
5.配置相应的权限和注册所需要的Activity
<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"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" >
<intent-filter>
<data android:scheme="tencent1105785901" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.BROWSABLE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
6.修改ShareSDK.xml文件
这里我们以新浪微博,QQ为例。微信因为没有审核通过,所以没办法验证。想验证的话,需要在微信平台填写完清晰,完整的信息,提交审核通过之后即可,修改的过程同下。
<ShareSDK
AppKey = "1985fae01629d"/>
<SinaWeibo
Id="2"
SortId="2"
AppKey="2022241043"
AppSecret="6e22ea802d34e493d6663294bd7597a0 "
RedirectUrl="http://blog.csdn.net/donkor_"
ShareByAppClient="true"
Enable="true" />
<QQ
Id="7"
SortId="7"
AppId="1105785901"
AppKey="k2sXKmeDIqrjpLO4"
BypassApproval="true"
ShareByAppClient="true"
Enable="true"/>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
7.添加分享代码
ShareSDK.initSDK(MainActivity.this)
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://blog.csdn.net/donkor_")
// text是分享文本,所有平台都需要这个字段
oks.setText("分享文本内容")
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数
// oks.setImagePath("/sdcard/test.jpg")
// 确保SDcard下面存在此张图片
oks.setImageUrl("https://img-blog.csdn.net/20161115193036196")
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl("http://blog.csdn.net/donkor_")
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
//oks.setComment("")
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(getString(R.string.app_name))
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
//oks.setSiteUrl(getString(R.string.settingShareSiteUrl))
// 启动分享GUI
oks.show(MainActivity.this)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
8.添加第三方登录代码
ShareSDK.initSDK(this);
private void authorize(Platform plat) {
if (plat.isValid()) {
String userId = plat.getDb().getUserId();
if (!TextUtils.isEmpty(userId)) {
UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);
login(plat.getName(), userId, null);
return;
}
}
plat.setPlatformActionListener(MainActivity.this);
plat.SSOSetting(false);
plat.showUser(null);
}
private void login(String plat, String userId, HashMap<String, Object> userInfo) {
Message msg = new Message();
msg.what = MSG_LOGIN;
msg.obj = plat;
UIHandler.sendMessage(msg, this);
}
UIHandler需要实现接口,并实现其中的方法
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_USERID_FOUND: {
Toast.makeText(this, R.string.userid_found, Toast.LENGTH_SHORT).show()
}
break
case MSG_LOGIN: {
String text = getString(R.string.logining, msg.obj)
Toast.makeText(this, text, Toast.LENGTH_SHORT).show()
}
break
case MSG_AUTH_CANCEL: {
Toast.makeText(this, R.string.auth_cancel, Toast.LENGTH_SHORT).show()
}
break
case MSG_AUTH_ERROR: {
Toast.makeText(this, R.string.auth_error, Toast.LENGTH_SHORT).show()
}
break
case MSG_AUTH_COMPLETE: {
Toast.makeText(this, R.string.auth_complete, Toast.LENGTH_SHORT).show()
}
break
}
return false
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
plat.setPlatformActionListener(MainActivity.this)设置监听,需要实现它的三个方法:
- onCancel 取消
- onComplete 完成
- onError 异常
@Override
public void onComplete(Platform platform, int action, HashMap<String, Object> res) {
if (action == Platform.ACTION_USER_INFOR) {
//登录成功,获取需要的信息
UIHandler.sendEmptyMessage(MSG_AUTH_COMPLETE, this)
login(platform.getName(), platform.getDb().getUserId(), res)
Log.e("asd", "platform.getName():" + platform.getName())
Log.e("asd", "platform.getDb().getUserId()" + platform.getDb().getUserId())
String openid = platform.getDb().getUserId() + ""
String gender = platform.getDb().getUserGender()
String head_url = platform.getDb().getUserIcon()
String nickname = platform.getDb().getUserName()
Log.e("asd", "openid:" + openid)
Log.e("asd", "gender:" + gender)
Log.e("asd", "head_url:" + head_url)
Log.e("asd", "nickname:" + nickname)
}
}
@Override
public void onError(Platform platform,int action,Throwable t){
if(action==Platform.ACTION_USER_INFOR){
UIHandler.sendEmptyMessage(MSG_AUTH_ERROR,this)
}
t.printStackTrace()
}
@Override
public void onCancel(Platform platform, int action) {
if (action == Platform.ACTION_USER_INFOR) {
UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL, this)
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
清除第三方登录,分享的信息与缓存
Platform qq = ShareSDK.getPlatform(MainActivity.this, QQ.NAME)
Platform wechat = ShareSDK.getPlatform(MainActivity.this, Wechat.NAME)
Platform weibo = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME)
if (qq.isValid()) {
qq.removeAccount()
}
if (wechat.isValid()) {
wechat.removeAccount()
}
if (weibo.isValid()) {
weibo.removeAccount()
}
string.xml
<string name="userid_found">用户信息已存在,正在跳转登录操作…</string>
<string name="logining">使用%s帐号登录中…</string>
<string name="auth_cancel">授权操作已取消</string>
<string name="auth_error">授权操作遇到错误,请阅读Logcat输出</string>
<string name="auth_complete">授权成功,正在跳转登录操作…</string>
布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginTop="50dp"
android:orientation="horizontal">
<View
android:layout_width="0dp"
android:layout_height="0.3dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="@android:color/black" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="第三方账号登录"
android:textSize="14sp" />
<View
android:layout_width="0dp"
android:layout_height="0.3dp"
android:layout_marginTop="10dp"
android:layout_weight="1"
android:background="@android:color/black" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="horizontal">
<ImageView
android:id="@+id/ivQQ"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/img_qq" />
<ImageView
android:id="@+id/ivWeChat"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/img_wechat" />
<ImageView
android:id="@+id/ivSinaWeibo"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/img_weibo" />
</LinearLayout>
<Button
android:id="@+id/btnRemoveMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="退出第三方登录数据信息"
android:layout_margin="30dp"
/>
<Button
android:id="@+id/btnShare"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="社会化分享"
android:layout_margin="30dp"
/>
</LinearLayout>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
视频演示效果:
视频链接地址
CSDN下载地址 : http://download.csdn.net/detail/donkor_/9700844