安卓集成第三方--使用ShareSdk实现登录和分享

1.在mob平台申请开发者账号。
2.登录平台–进入后台管理–添加应用–输入应用名称–保存
3.点击设置拿到AppKey(例如20fc03f97d200)和App Secre(例7fa615852059c3d565df5856a8c10e32)
4.进入Mob官方网址首页http://www.mob.com/ ,下载对应的Sdk。
点击Share SDK For Android下载对应的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);
}

}

猜你喜欢

转载自blog.csdn.net/fishandbean/article/details/77983324