1.在mob平台申请开发者账号。
2.登录平台–进入后台管理–添加应用–输入应用名称–保存
3.点击设置拿到AppKey(例如20fc03f97d200)和App Secre(例7fa615852059c3d565df5856a8c10e32)
4.进入Mob官方网址首页http://www.mob.com/ ,下载对应的Sdk。
5.点击下载。
6.这里会弹出来选择框,只需要选择对应的平台点击下载就可以了。
7.解压下载的文件,如下图所示。
8.打开ShareSDK for Android文件夹
双击QuickIntegrater,
然后填写自己的项目名称,和包名,选择需要集成的平台,(我这里只集成了这几个,下载的sdk并不是全部的,所以示例也比较少),点击确认。会出现以下提示:
8.点击确定,找到刚才我们生成的那个自己的项目名为名的文件夹,打开。
复制所有文件夹下的内容到自己的项目对应的目录下。下面这个文件夹是用来实现国际化的,无需复制,如果加在自己的项目中签名打包的时候可能会报错。
准备工作完成了,接下来就可以开始写代码啦。
先从清单文件写起吧。
1.添加如下权限,基本上我们的项目里面都会有。
<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.SYSTEM_ALERT_WINDOW" />
2.修改Application节点下的内容:
(1)如果我们的Application没有继承其他的Application,可以让我们的Application直接继承MobApplication,在清单文件的Application节点下添加
android:name=”com.mob.MobApplication”
(2)我们的Application已经继承了其他的Application,无法再继承MobApplication,就在我们的Application的OnCreate方法里面添加
MobSDK.init(this,"AppKey","App Secre");
(3)不同的集成度需要在AndroidManifest.xml中添加的内容不一样。
<!-- 调用分享的界面,需要注册的activity -->
<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
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>
</activity>
如果您的项目集成微信或者微信朋友圈,请查看AndroidManifest.xml配置文件里的package路径,需要在package目录下创建wxapi目录再放置WXEntryActivity。 在微信分享后的回调中会检查是否有此activity,没有此activity将会报错。
<activity
android:name=".wxapi.WXEntryActivity"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
3.添加代码。
(1)要实现登录的Activity要实现两个接口 Callback, PlatformActionListener,然后实现接口对应的方法:
private static final int MSG_LOGIN = 1;
private static final int MSG_USERID_FOUND = 2;
private static final int MSG_AUTH_COMPLETE = 3;
private static final int MSG_AUTH_ERROR = 4;
private static final int MSG_AUTH_CANCEL = 5;
@Override
public boolean handleMessage(Message message) {
switch (message.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, message.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;
}
@Override
public void onComplete(Platform platform, int action, HashMap<String, Object> hashMap) {
if (action == Platform.ACTION_USER_INFOR) {
UIHandler.sendEmptyMessage(MSG_AUTH_COMPLETE, this);
login(platform.getName(), platform.getDb().getToken(), platform.getDb().getUserId(),hashMap);
}
}
@Override
public void onError(Platform platform, int action, Throwable throwable) {
if (action == Platform.ACTION_USER_INFOR) {
UIHandler.sendEmptyMessage(MSG_AUTH_ERROR, this);
}
throwable.printStackTrace();
Log.i("登录失败", throwable.getStackTrace().toString() + "");
Log.i("登录失败", throwable.getMessage() + "");
}
@Override
public void onCancel(Platform platform, int action) {
if (action == Platform.ACTION_USER_INFOR) {
UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL, this);
}
}
private void login(String platformNname, String token, String userId, HashMap<String, Object> hashMap) {
Message msg = Message.obtain();
msg.what = MSG_LOGIN;
msg.obj = platformNname;
if (Wechat.NAME.equals(platformNname)) {
this.platformNname = "2";
} else if (SinaWeibo.NAME.equals(platformNname)) {
this.platformNname = "4";
} else if (QQ.NAME.equals(platformNname)) {
this.platformNname = "3";
}
this.token = token;
this.userId = userId;
Log.i("第三方登录","platformNname:"+platformNname);
Log.i("第三方登录","userId:"+userId);
Log.i("第三方登录","token:"+token);
UIHandler.sendMessage(msg, this);
}
吐司对应的String如下:
<string name="share">分享</string>
<string name="auth_cancel">授权操作已取消</string>
<string name="auth_error">授权操作遇到错误,请阅读Logcat输出</string>
<string name="auth_complete">授权成功,正在跳转登录操作…</string>
<string name="if_register_needed">如果您需要注册功能…</string>
<string name="after_auth">一般来说第三方登录时,第三方平台已经为您完成用户身份校验,您可以放心让用户登录。\n\n但如果您需要判断用户是否为新用户,可以在授权操作完成后,将用户的信息通过字段“HashMap userInfo”携带给login方法。客户端通过“String userId”执行登录请求,如果服务端判定此userId为未注册用户,可以将userInfo发送给注册接口,获取用户在此平台上的昵称、头像等数据,然后执行注册</string>
<string name="userid_found">用户信息已存在,正在跳转登录操作…</string>
<string name="logining">使用%s帐号登录中…</string>
(2)添加登录代码
微信登录:
Platform plat = ShareSDK.getPlatform(Wechat.NAME);
authorize(plat);
QQ登录:
Platform platQQ = ShareSDK.getPlatform(QQ.NAME);
authorize(platQQ);
微博登录:
Platform platWeiBo = ShareSDK.getPlatform(SinaWeibo.NAME);
authorize(platWeiBo);
下面这个方法是用来处理授权以及注册授权的接口的,在这里QQ,WeChat,SinaWeb都调用这个方法,统一处理:
public void authorize(Platform plat) {
if (plat.isClientValid()) {
//客户端可用
} else {
//客户端不可用
}
if (plat.isAuthValid()) {
// plat.removeAccount(true);//这一句代码是删除缓存的用户信息
String userId = plat.getDb().getUserId();//userId
String token = plat.getDb().getToken();//token
String type = plat.getName();//平台名称
if (!TextUtils.isEmpty(userId)) {
UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);
login(type, token, userId, null);
return;
}
}
plat.setPlatformActionListener(this);
plat.showUser(null);
}
(2)添加分享代码(由于个平台分享需要的参数不一样,所以最好分开单独设置)
private void showShare() {
OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();
oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback() {
@Override
public void onShare(Platform platform, Platform.ShareParams paramsToShare) {
Bitmap logo = BitmapFactory.decodeResource(context.getResources(), R.mipmap.logo3);
if (SinaWeibo.NAME.equals(platform.getName())){
paramsToShare.setImageData(logo);
paramsToShare.setText("我是分享的文本,可以在这里设置分享的文字信息");
}
if (QQ.NAME.equals(platform.getName())){
paramsToShare.setTitleUrl("http://write.blog.csdn.net/mdeditor#!postId=77983324");
paramsToShare.setTitle("云验证");
paramsToShare.setText("我是分享的文本,可以在这里设置分享的文字信息");
}
if (Wechat.NAME.equals(platform.getName())){
paramsToShare.setImageData(logo);
paramsToShare.setUrl("http://write.blog.csdn.net/mdeditor#!postId=77983324");
paramsToShare.setShareType(Platform.SHARE_WEBPAGE);
paramsToShare.setText("我是微信分享的文本");
}
if (WechatMoments.NAME.equals(platform.getName())){
paramsToShare.setImageData(logo);
paramsToShare.setText("朋友圈分享"+"http://write.blog.csdn.net/mdeditor#!postId=77983324");
}
if (WechatFavorite.NAME.equals(platform.getName())){
paramsToShare.setImageData(logo);
paramsToShare.setText("微信收藏分享"+"http://write.blog.csdn.net/mdeditor#!postId=77983324");
}
}
});
oks.show(context);
}
}