ShareSDK是一种社会化分享组件,为iOS、Android、WP8 的APP提供社会化功能,集成了一些常用的类库和接口,缩短开发者的开发时间,还有社会化统计分析管理后台。
使用ShareSDK maven集成方式,不需要在AndroidMainfest.xml下面配置任何权限和Activity
(1)打开项目根目录的gradle.build,在buildscrip>repositories的方法下面添加maven库的路径引用
maven {
url "http://mvn.mob.com/android"
}
(2)在gradle.build下面的dependencies依赖模块下面添加MobSDK的依赖
dependencies {
...
classpath 'com.mob.sdk:MobSDK:+'
}
(3)、在使用到Mob产品的module下面的build.gradle文件里面添加引用
apply plugin: 'com.android.application'
apply plugin: ‘com.mob.sdk’
(4).然后添加MobSDK方法,配置mob的key和秘钥
Onekeyshare是ShareSDK的GUI界面,如果不需要,则需要添加”gui false”,因为默认是使用gui,version字段为SDK的版本号,不设置则使用最新的版本;
MobSDK {
appKey "d580ad56b4b5"
appSecret "7fcae59a62342e7e2759e9e397c82bdd"
ShareSDK {}
}
(5)、maven集成方式可以在Mob产品的module下面的build.gradle文件里面配置ShareSDK各个社交平台的key信息
MobSDK {
appKey "d580ad56b4b5"
appSecret "7fcae59a62342e7e2759e9e397c82bdd"
ShareSDK {
//平台配置信息
devInfo {
SinaWeibo {
appKey "568898243"
appSecret "38a4f8204cc784f81f9f0daaf31e02e3"
callbackUri "http://www.sharesdk.cn"
shareByAppClient false
}
Wechat {
appId "wx4868b35061f87885"
appSecret "64020361b8ec4c99936c0e3999a9f249"
}
QQ {
appId "100371282"
appKey "aed9b0303e3ed1e27bae87c33761161d"
}
Facebook {
appKey "1412473428822331"
appSecret "a42f4f3f867dc947b9ed6020c2e93558"
callbackUri "https://mob.com"
}
}
}
}
其中的devInfo为来自社交平台的应用信息。
(6).初始化MobSDK
如果您没有在AndroidManifest中设置appliaction的类名,MobSDK会将这个设置为com.mob.MobApplication,但如果您设置了,请在您自己的Application类中调用
MobSDK.init(this);
注册并且创建应用,获得ShareSDK的Appkey,然后到SDK的下载页面下载SDK的压缩包
sdk下载地址
http://www.mob.com/downloadDetail/ShareSDK/android
下载sdk后快速生成项目,把生成的资源复制到项目中
添加权限
<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.RECEIVE_SMS" />
在清单文件AndroidManifest.xml添加activity信息
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
android:name="Mob-AppKey"
android:value="239d49dc33750"/>
<meta-data
android:name="Mob-AppSecret"
android:value="7dd2be46765063ee764e7011ccceeb84"/>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
intent-filter>
activity>
<activity android:name=".LoginActivity">
activity>
<activity
android:name="com.mob.tools.MobUIShell"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:windowSoftInputMode="stateHidden|adjustResize">
<meta-data
android:name="AuthorizeAdapter"
android:value="cn.sharesdk.demo.MyAdapter"/>
<intent-filter>
<data android:scheme="db-7janx53ilz11gbs"/>
<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>
<data android:scheme="tencent100371282"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
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>
<intent-filter android:priority="1000">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="line.1477692153"/>
intent-filter>
activity>
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
application>
所谓的第三方登录,就是利用用户在第三方平台上已有的账号来快速完成自己应用的登录或者注册的功能。而这里的第三方平台,一般是已经有大量用户的平台,如国内的新浪微博、QQ空间,微信,外国的Facebook、twitter等等。第三方登录不是一个具体的接口,而是一种思想或者一套步骤。
选择好平台以后,现在思考下面的问题:
你的应用是否具备独立账户系统?
这个问题是第三方登录时接口选择的重要标准。如果你选择“是”,则意味着你的应用只是需要第三方平台的用户,而不是他们的账户验证功能——也就是“要数据,不要功能”。而如果你选择“否”,则表示你实际上是’“要功能,不要数据(用户)”’。对于ShareSDK来说,前者你的入口方法是showUser(null),而后者是authorize()。那么下面我分情况解释两种接入方式的步骤。
package com.example.administrator.sharesdk_312;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;
import java.util.HashMap;
import cn.sharesdk.framework.Platform;
import cn.sharesdk.framework.PlatformActionListener;
import cn.sharesdk.framework.ShareSDK;
import cn.sharesdk.sina.weibo.SinaWeibo;
import cn.sharesdk.tencent.qq.QQ;
import cn.sharesdk.wechat.friends.Wechat;
/**
* ShareSDK第三方登录
* 1.手动授权
* 2.自动授权
* 3.SSO授权:就是利用这些平台的手机客户端来完成授权。由于SSO的授权方式对于用户来说更加便捷,
* 因此各大平台均建议开发者优先使用这一种授权方式。ShareSDK提供SSO的授权实现,并且默认情况下是使用的
*
* platform.showUser(null);//授权并获取用户信息,具备独立账户系统,就是说你的应用自己就有注册和登录功能,要数据,不要功能
* platform.authorize();//单独授权,OnComplete返回的hashmap是空的,不具备独立账户系统,要功能,不要数据(用户)
*/
public class LoginActivity extends AppCompatActivity implements PlatformActionListener {
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
Toast.makeText(LoginActivity.this, "授权登陆成功", Toast.LENGTH_SHORT).show();
Platform platform = (Platform) msg.obj;
String userId = platform.getDb().getUserId();//获取用户账号
String userName = platform.getDb().getUserName();//获取用户名字
String userIcon = platform.getDb().getUserIcon();//获取用户头像
String userGender = platform.getDb().getUserGender(); //获取用户性别,m = 男, f = 女,如果微信没有设置性别,默认返回null
Toast.makeText(LoginActivity.this, "用户名:" + userName + " 性别:" + userGender, Toast.LENGTH_SHORT).show();
//下面就可以利用获取的用户信息登录自己的服务器或者做自己想做的事啦!
//。。。
break;
case 2:
Toast.makeText(LoginActivity.this, "授权登陆失败", Toast.LENGTH_SHORT).show();
break;
case 3:
Toast.makeText(LoginActivity.this, "授权登陆取消", Toast.LENGTH_SHORT).show();
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
public void login(View view) {
switch (view.getId()) {
case R.id.btn_qq_login: //qq登陆
loginByQQ();
break;
case R.id.btn_wexin_login: //微信登陆
loginByWeixin();
break;
case R.id.btn_weibo_login: //微博登陆
loginByWeibo();
break;
}
}
/**
* 微博登陆
*/
private void loginByWeibo() {
Platform sinaWeibo = ShareSDK.getPlatform(SinaWeibo.NAME);
sinaWeibo.setPlatformActionListener(this);
sinaWeibo.SSOSetting(false);
//sinaWeibo.SSOSetting(true); // true表示不使用SSO方式授权
if (!sinaWeibo.isClientValid()) {
Toast.makeText(this, "新浪微博未安装,请先安装新浪微博", Toast.LENGTH_SHORT).show();
}
authorize(sinaWeibo);
}
/**
* 微信登陆
*/
private void loginByWeixin() {
Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
wechat.setPlatformActionListener(this);
wechat.SSOSetting(false);
if (!wechat.isClientValid()) {
Toast.makeText(this, "微信未安装,请先安装微信", Toast.LENGTH_SHORT).show();
}
authorize(wechat);
}
/**
* qq登陆
*/
private void loginByQQ() {
// Platform platform = ShareSDK.getPlatform(QQ.NAME);
// //回调信息,可以在这里获取基本的授权返回的信息,但是注意如果做提示和UI操作要传到主线程handler里去执行
// //手动授权
// platform.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 arg2) {
// // TODO Auto-generated method stub
// //输出所有授权信息
// arg0.getDb().exportData();
// }
//
// @Override
// public void onCancel(Platform arg0, int arg1) {
// // TODO Auto-generated method stub
//
// }
// });
// //authorize与showUser单独调用一个即可
// platform.authorize();//单独授权,OnComplete返回的hashmap是空的,要功能,不要数据(用户)
// platform.showUser(null);//授权并获取用户信息,具备独立账户系统,要数据,不要功能
// //移除授权
// //platform.removeAccount(true);
Platform qq = ShareSDK.getPlatform(QQ.NAME);
qq.setPlatformActionListener(this);
qq.SSOSetting(false);
if (!qq.isClientValid()) {
Toast.makeText(this, "QQ未安装,请先安装QQ", Toast.LENGTH_SHORT).show();
}
authorize(qq);
}
/**
* 授权
*
* @param platform
*/
private void authorize(Platform platform) {
if (platform == null) {
return;
}
if (platform.isAuthValid()) { //如果授权就删除授权资料
platform.removeAccount(true);
}
platform.showUser(null); //授权并获取用户信息
}
/**
* 授权成功的回调
*
* @param platform
* @param i
* @param hashMap
*/
@Override
public void onComplete(Platform platform, int i, HashMap hashMap) {
Message message = Message.obtain();
message.what = 1;
message.obj = platform;
mHandler.sendMessage(message);
}
/**
* 授权错误的回调
*
* @param platform
* @param i
* @param throwable
*/
@Override
public void onError(Platform platform, int i, Throwable throwable) {
Message message = Message.obtain();
message.what = 2;
message.obj = platform;
mHandler.sendMessage(message);
}
/**
* 授权取消的回调
*
* @param platform
* @param i
*/
@Override
public void onCancel(Platform platform, int i) {
Message message = Message.obtain();
message.what = 3;
message.obj = platform;
mHandler.sendMessage(message);
}
}
/**
* onekeyshare分享调用九宫格方法
*/
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);
}
/**
* 指定平台分享
*/
private void showShare2() {
Platform platform = ShareSDK.getPlatform(SinaWeibo.NAME); //获取分享平台
//设置平台监听器
platform.setPlatformActionListener(new PlatformActionListener() {
@Override
public void onComplete(Platform platform, int i, HashMap hashMap) {
// TODO: 2016/11/3 此方法中增加分享功能
switch (i) {
case Platform.ACTION_AUTHORIZING:
Toast.makeText(getApplicationContext(), "授权成功", Toast.LENGTH_SHORT).show();
//获取分享参数
SinaWeibo.ShareParams params = new SinaWeibo.ShareParams();
String sTxt = "http://www.baidu.com/互联";//转成url编码
try {
sTxt += URLEncoder.encode("互联", "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
params.setText("测试指定平台分享 @1611 zsp 分享地址:" + sTxt);
platform.share(params); //开始分享
platform.showUser(null);
break;
case Platform.ACTION_SHARE:
Log.d("zsp", "分享成功");
Toast.makeText(getApplication(), "分享成功", Toast.LENGTH_SHORT).show();
break;
case Platform.ACTION_USER_INFOR:
//显示所有用户信息
for (Map.Entry e : hashMap.entrySet()) {
Log.d("zsp", e.getKey() + "---" + e.getValue());
}
break;
}
}
@Override
public void onError(Platform platform, int i, Throwable throwable) {
}
@Override
public void onCancel(Platform platform, int i) {
}
});
platform.authorize();//分享授权
}