帮助与文档

> >

Android 自定义平台

定义

ShareSDK当前集成超过20种国内外的社交平台,后续也还将继续添加,但是我们的速度有限,为了让开发者既能使用ShareSDK的框架,保持代码的统一性,又能更快添加自己需要的、而ShareSDK还没有提供的平台,我们开放了自定义平台的功能,它能如同插件服务一样注册到ShareSDK中,然后如同获取其他内置平台一样获取出来,统一处理。

所有自定义平台都继承自cn.sharesdk.framework.CustomPlatform,而CustomPlatform则继承自Platform。之所以不直接继承自Platform,是因为Platform有一些内部的方法,这些方法会和ShareSDK的后台进行通信。为了使开发者免去对这些接口的学习,在开发者的平台和Platform之间插入了CustomPlatform,屏蔽不必要的方法。

分享到“来往”

下面的代码是使用自定义平台功能,实现“来往”分享的例子:

public class Laiwang extends CustomPlatform {
        public static final String NAME = Laiwang.class.getSimpleName();

        public Laiwang(Context context) {
                super(context);
        }

        public String getName() {
                return NAME;
        }

        protected boolean checkAuthorize(int action, Object extra) {
                return isValid();
        }

        public boolean isValid() {
                return isClientInstalled();
        }

        private boolean isClientInstalled() {
                Intent i = new Intent(Intent.ACTION_SEND);
                i.setPackage("com.alibaba.android.babylon");
                i.setType("image/*");
                PackageManager pm = getContext().getPackageManager();
                List<?> ris = pm.queryIntentActivities(i, PackageManager.GET_ACTIVITIES);
                return ris != null && ris.size() > 0;
        }

        protected void doShare(ShareParams params) {
                Intent i = new Intent(Intent.ACTION_SEND);
                i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                i.setPackage("com.alibaba.android.babylon");
                if (!TextUtils.isEmpty(params.imagePath) 
                                && (new File(params.imagePath).exists())) {
                        Uri uri = Uri.fromFile(new File(params.imagePath));
                        i.putExtra(Intent.EXTRA_STREAM, uri);
                        i.setType("image/*");
                        try {
                                getContext().startActivity(i);
                                if (listener != null) {
                                        HashMap<String, Object> res = new HashMap<String, Object>();
                                        res.put("ShareParams", params);
                                        listener.onComplete(this, ACTION_SHARE, res);
                                }
                        } catch (Throwable t) {
                                listener.onError(this, ACTION_SHARE, t);
                        }
                } else if (!TextUtils.isEmpty(params.text)) {
                        i.putExtra(Intent.EXTRA_TEXT, params.text);
                        i.setType("text/plain");
                        try {
                                getContext().startActivity(i);
                                if (listener != null) {
                                        HashMap<String, Object> res = new HashMap<String, Object>();
                                        res.put("ShareParams", params);
                                        listener.onComplete(this, ACTION_SHARE, res);
                                }
                        } catch (Throwable t) {
                                listener.onError(this, ACTION_SHARE, t);
                        }
                } else if (listener != null) {
                        Throwable t = new Throwable("Share content is empty!");
                        listener.onError(this, ACTION_SHARE, t);
                }
        }

}

上面的代码是一个完整的类,类中的方法名和用途大多在其他章节中已经描述,下面介绍几个比较须要注意方法。

checkAuthorize

这个方法是ShareSDK在开始非授权事件前,内部判断此平台是否已经完成授权的依据。返回true则表示已经完成授权,否则就应该执行多一次授权。自定义平台没有自动授权的功能,因为这个方法被开放出来,代码需要开发者自行填充。ShareSDK一般认为,如果目标操作使用的是平台的客户端来完成(比方说微信的分享),则只要客户端已经安装了,这个方法就返回true。换句话说,这个方法是指“要执行的事件是否可以立刻执行”,所谓的“自动授权”,只是在操作前告诉ShareSDK“不可以立刻执行,应该先等待授权”而已。

doShare

CustomPlatform有好几个“doXXX”的方法,用来实际处理不同事件的,比方说doShare就是用来执行share方法的操作。这些方法被执行在“外部方法”的子线程中,因此可以随意调用网络或者数据接口,但是最好不要直接操作UI,因为可能出错。

上文例子中doShare调用了Android系统的内置分享功能,将分享数据传递个来往客户端以完成分享。这样子的操作无法得到来往的返回,因此只要打开来往客户端,就算成功。

关于更多的接口解释,可以参考我们的API文档。