帮助与文档

> >

一、Android 授权以及授权页面自定义

ShareSDK的授权分为“手动授权”和“自动授权”。前者是指显式调用ShareSDK的授权代码来执行授权操作,后者是执行ShareSDK的操作前不考虑具体平台是否已经完成授权操作,直接调用其对应方法执行操作(如分享操作),ShareSDK内部会根据平台数据库中的数据判断其是否已经完成授权,若是未授权或授权信息已经失效,则自行启动授权流程,执行授权。自动授权于开发者是透明的,但是于用户来说依然存在。
不管您选择的是“手动授权”还是“自动授权”,授权都是您接触ShareSDK的第一个操作。
对于大部分的应用来说,手动授权是没有必要的,但是如果您只是想做一个“账号系统”,或者是说您的应用不需要注册,只需要是微博的用户,就能登录,那么这个方法还是十分有用途的。

二、手动授权

下面是新浪微博授权操作的例子:

Platform weibo = ShareSDK.getPlatform(SinaWeibo.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();
        }

@Override
public void onCancel(Platform arg0, int arg1) {
        // TODO Auto-generated method stub

        }
});
//authorize与showUser单独调用一个即可
weibo.authorize();//单独授权,OnComplete返回的hashmap是空的
weibo.showUser(null);//授权并获取用户信息
//移除授权
//weibo.removeAccount(true);

调用authorize方法,会弹出一个基于ShareSDKUIShell的授权页面,填写账号和密码以后,会执行授权操作。这个方法的操作回调paListener并不实际带回什么数据,只是通过回调告知外部成功或者失败。但是每一个平台都具备一个PlatformDb的成员,这里面存储了此平台的授权信息。可以参考如下章节7的平台数据库的操作的说明或查看获取授权用户资料章节,通过方法getToken、getUserId等方法,获取授权用户在此平台上的授权信息。并由此建立“账户系统”。

以上是授权新浪微博的例子,如果想授权其他的第三方平台,只需要通过修改平台的名称。

Platform qq = ShareSDK.getPlatform(QQ.NAME);

平台的名称可以在assets下shareSDK.xml文件里面对应获取找到。如下所示:SinaWeibo、QZone等

    <ShareSDK 
        AppKey = "androidv1101"/> <!-- 修改成你在sharesdk后台注册的应用的appkey"-->

    <!-- ShareByAppClient标识是否使用微博客户端分享,默认是false -->
    <SinaWeibo
        Id="1"
        SortId="1"
        AppKey="568898243"
        AppSecret="38a4f8204cc784f81f9f0daaf31e02e3"
        RedirectUrl="http://www.sharesdk.cn"
        ShareByAppClient="false"
        Enable="true" />

    <TencentWeibo
        Id="2" 
        SortId="2"
        AppKey="801307650"
        AppSecret="ae36f4ee3946e1cbb98d6965b0b2ff5c"
        RedirectUri="http://sharesdk.cn"
        Enable="true" />

    <!-- ShareByAppClient标识是否使用微博客户端分享,默认是false -->
    <QZone
        Id="3"
        SortId="3"
        AppId="100371282"
        AppKey="aed9b0303e3ed1e27bae87c33761161d"
        ShareByAppClient="true"
        Enable="true" />

三、自动授权

自动授权就是直接无视授权操作而调用其他的操作(如关注或者分享)。在自动授权下,授权操作对开发者而言是透明的,它由ShareSDK内部控制,开发者没有调用授权的代码,也没有办法接收到授权的结果。比方说如果开发者执行关注,则发起时调用的方法是关注,操作回调中得到的结果(不管成败)也是关注。
关于这些操作的例子,可以参考其对应的章节。

 

四、SSO (Single Sign-On)

SSO授权方式,简单来说就是使用目标平台客户端来完成授权。

Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.SSOSetting(false);  //设置false表示使用SSO授权方式
weibo.setPlatformActionListener(this); // 设置分享事件回调

weibo.authorize();//单独授权
weibo.showUser(null);//授权并获取用户信息

使用了SSO授权后,有客户端的都会优先启用客户端授权,没客户端的则任然使用网页版进行授权。

这里需要注意的是新浪微博客户端授权是需要用户在开发者平台(网址:http://open.weibo.com)申请的应用用过了新浪的审核。而且要通过keystore进行签名打包测试。注意打包所用的keystore上的md5签名、项目的包名要与新浪开发者平台上填写的签名与包名一致。对比方式如图:

平台截图:

QQ截图20141109164024

 

项目包名:

02

keystore的md5签名:

QQ截图20141109163959

 

五、自定义授权页面

本节介绍的是如何自定义“Web授权页面”,由于SSO授权方式使用的是目标平台的客户端,ShareSDK无法修改其页面,因此不在介绍范围之内。
ShareSDK的所有GUI都基于ShareSDKUIShell,但是ShareSDKUIShell只是一个容器,真正显示授权页面主体和逻辑是几个FakeActivity的子类。这些控件在ShareSDK之外是不能修改的,但是考虑到很多开发者希望可以修改这个页面的布局、逻辑等等代码,因此ShareSDK为此提供了一个自定义授权页面的方法,操作如下:
1)打开AndroidManifest.xml,并如下修改ShareSDKUIShell的注册信息:

<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait"
android:windowSoftInputMode="stateHidden|adjustResize" >
<!--
AuthorizeAdapter继承自
cn.sharesdk.framework. authorize.AuthorizeAdapter,
可以监听到页面的生命周期,也能获取页面的各种UI控件。
开发者可以通过继承AuthorizeAdapter,重写其方法,
并获取各种UI来自定义这个页面的行为。
-->
<meta-data android:name="AuthorizeAdapter"
android:value="cn.sharesdk.demo.MyAdapter" />
</activity>

其中的cn.sharesdk.demo.MyAdapter是一个继承自cn.sharesdk.framework.authorize.AuthorizeAdapter的类。开发者可以根据自己的需要,修改Adapter为任何类名和路径,但是一定要继承自AuthorizeAdapter。当然,如果您不想修改授权页面,可以不设置这个Adapter。
2)创建MyAdapter这个类,然后添加自定义代码,如(修改授权页面标题栏的文字):

//import cn.sharesdk.tencent.qq.QQWebShareAdapter;(QQWeb登陆需要继承的类)
//import cn.sharesdk.tencent.qzone.QZoneWebShareAdapter;
(QQ空间Web登陆需要继承的类)

import cn.sharesdk.framework.TitleLayout;
import cn.sharesdk.framework.authorize.AuthorizeAdapter;
import com.mob.tools.utils.R;

public class MyAdapter extends AuthorizeAdapter {
public void onCreate() {
System.out.println("> ShareSDKUIShell created!");
//获取标题栏控件
		TitleLayout llTitle = getTitleLayout();
//标题栏的文字修改
		int resID= R.getStringRes(getActivity(), "second_title");//这个字段定义在strings.xml文件里面
		llTitle.getTvTitle().setText(resID);
} 

public void onDestroy() {
System.out.println("> ShareSDKUIShell will be destroyed.");
}
}

上面的onCreate、onResum、onStop、onDestroy等方法都在ShareSDKUIShell的生命周期不停时段被调用,如onCreate、onDestroy分别在授权页面被创建(但还没有显示),以及即将被关闭时被调用。也就是说可以通过这些方法参与授权页面的生命周期。而getPlatformName、getTitleLayout和getWebBody分别返回授权平台的名称、授权页面标题栏控件和授权页面主体部分的WebView,开发者可以通过平台名称和控件实例,修改整个页面的布局甚至行为。
请注意,注册在Adapter下的AuthorizeAdapter子类不能被混淆!否则ShareSDK无法找到这个类
更多关于自定义授权页面的操作技巧,请参考ShareSDK BBS上的相关帖子。

六、平台数据库的操作

ShareSDK将每一个平台的授权数据都缓存在SharedPreferences中,并且相互独立。如果您希望获取任何一个平台的授权数据,可以像下面这样子做:

Platform qzone = ShareSDK.getPlatform(QZone.NAME);
String accessToken = qzone.getDb().getToken(); // 获取授权token
String openId = qzone.getDb().getUserId(); // 获取用户在此平台的ID
String nickname = qzone.getDb().getUserName(); // 获取用户昵称
//部分没有封装的字段可以通过键值获取,例如下面微信的unionid字段
Platform wechat = ShareSDK.getPlatform(Wechat.NAME);
String unionid = wechat.getDb().get("unionid");
// 接下来执行您要的操作

不同平台都会缓存accessToken、expiresIn、UserId、nickname等信息,分别表示授权的Token、授权Token的有效时间、用户在此平台上的ID、用户的昵称等信息。可以通过getToken()或者setToken()进行操作。此外,开发者还可以通过直接get()某个字段的办法,获取其数据,如上面通过“nickname”字段获取到用户的昵称。
ShareSDK同时还允许开发者使用“exportData”和“importData”两个方法,批量导出和导入PlatformDb中的数据。开放这两个方法的目的是:部分应用具备多用户系统,如果同一设备上不同时期要登录多个账户,那么他们需要备份上一个用户的资料。ShareSDK并不设置多用户系统,但是用户可以通过登录不同用户的时候,批量导出旧用户的资料,然后再登录新用户,直到新用户登录成功后,再重新导入旧用户登录数据,实现其多用户系统功能。

七、删除授权信息

由于ShareSDK所有的授权数据都存在PlatformDb中,所以“用户是否”授权,和“取消授权(清除授权信息)”的操作依据其实PlatformDb。在ShareSDK中,判断此平台是否授权的方法是isValid,而取消授权的方法是removeAccount,下面的代码演示客户端判断是否已经授权,如果授权就删除授权资料,否则就执行授权:

Platform qzone = ShareSDK.getPlatform(QZone.NAME);
If (qzone.isAuthValid()) {
qzone.removeAccount(true);
}
qzone.setPlatformActionListener(paListener);
//authorize与showUser单独调用一个即可
qzone.authorize();//单独授权,OnComplete返回的hashmap是空的
qzone.showUser(null);//授权并获取用户信息
//isValid和removeAccount不开启线程,会直接返回。