专栏名称: 锯齿流沙
目录
相关文章推荐
开发者全社区  ·  原来如此:很多公司都不招大龄程序员了。。。 ·  18 小时前  
开发者全社区  ·  商·玉高冠鸟柄形器 ·  昨天  
开发者全社区  ·  AI 公司董事长...十几刀...刺死 ... ·  昨天  
开发者全社区  ·  北舞身材管理曝光 ·  2 天前  
51好读  ›  专栏  ›  锯齿流沙

Android 社会化分享,你应知道的知识都在这里

锯齿流沙  · 掘金  · android  · 2017-12-13 09:51

正文

分享,已经成为了一个app的标配了,因为分享到微信,微博和qq等社交平台有机会可以为自己的app带来大量的流量,提升app的知名度,这是一个快速而有效的增加app用户量的途径,所以分享对一个app来说,分享到微信,微博等社交平台是何其重要。

本文为读者带来android分享知识,包括借助第三方工具和手动实现android分享,首先我们使用第三方工具来实现,接着再带大家手动打造android分享。

第三方分享工具:极光社会化分享(sharesdk)、友盟社会化分享(Ushare)以及在githut上比较流行: ShareSDK ShareUtil BiliShare ShareLoginLib 等等。

使用极光社会分享到可以参考这篇文章 android集成极光社会化分享攻略 ,如果你想使用友盟社会化分享工具可以参考这篇文章 Android集成友盟社会化分享功能 。这两篇文章都详细介绍和实现了社会化分享。这里就不讲解使用极光社会分享和友盟来实现分享了。

ShareUtil

简介

ShareUtil 是一个综合性的分享及登录工具库,支持微信分享,微博分享,QQ分享,QQ空间分享以及Android系统默认分享,支持微信登录,微博登录以及QQ登录并获取用户信息。

使用

在app下的build.gradle添加依赖

免第三方Jar包配置 compile 'me.shaohui.shareutil:shareutil:1.3.8' 手动添加第三方jar compile 'me.shaohui.shareutil:shareutil:1.3.8.no_jar'

build.gradle 配置 在defaultConfig节点下增加你的qq id信息 defaultConfig { ....... manifestPlaceholders = [ // 替换成你的qq_id qq_id: "123345678" ] }

1)、初始化配置

ShareConfig config = ShareConfig.instance()
                .qqId(QQ_ID)
                .wxId(WX_ID)
                .weiboId(WEIBO_ID)
                // 下面两个,如果不需要登录功能,可不填写
                .weiboRedirectUrl(REDIRECT_URL)
                .wxSecret(WX_ID);
ShareManager.init(config);

2)、使用ShareUtil

使用ShareUtil类的api即可轻松实现社会化分享。 如:

ShareUtil.shareImage(MainActivity.this, SharePlatform.QQ,
                        "http://shaohui.me/images/avatar.gif", mShareListener);

ShareUtil.shareImage:分享图片。需要指定分享到那个平台: 1、SharePlatform.QQ分享到qq; 2、SharePlatform.QZONE分享到qq空间; 3、SharePlatform.WEIBO分享到微博; 4、SharePlatform.WX分享到微信; 5、SharePlatform.WX_TIMELINE分享到朋友圈。

mShareListener是需要设置的回调,来监听是否分享成功以及取消分享等。

以下代码是我的activity

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String QQ_ID = "your qqid";
    private static final String WX_ID = "your weixinid";
    private static final String WEIBO_ID = "your weibo id";
    private static final String REDIRECT_URL = "your weibo redirecturi";
    private ShareListener mShareListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initShare();
        initView();
        initListener();

    }

    private void initView() {
        this.findViewById(R.id.qq).setOnClickListener(this);
        this.findViewById(R.id.qqzone).setOnClickListener(this);
        this.findViewById(R.id.weibo).setOnClickListener(this);
        this.findViewById(R.id.weixin).setOnClickListener(this);
        this.findViewById(R.id.circle).setOnClickListener(this);
    }

    private void initListener() {
        mShareListener = new ShareListener() {
            @Override
            public void shareSuccess() {
                Toast.makeText(MainActivity.this, "分享成功", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void shareFailure(Exception e) {
                Toast.makeText(MainActivity.this, "分享失败", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void shareCancel() {
                Toast.makeText(MainActivity.this, "取消分享", Toast.LENGTH_SHORT).show();

            }
        };
    }

    private void initShare() {

        // init
        ShareConfig config = ShareConfig.instance()
                .qqId(QQ_ID)
                .wxId(WX_ID)
                .weiboId(WEIBO_ID)
                // 下面两个,如果不需要登录功能,可不填写
                .weiboRedirectUrl(REDIRECT_URL)
                .wxSecret(WX_ID);
        ShareManager.init(config);

    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.qq:
                ShareUtil.shareImage(MainActivity.this, SharePlatform.QQ,
                        "http://shaohui.me/images/avatar.gif", mShareListener);
                break;
            case R.id.qqzone:
                ShareUtil.shareMedia(MainActivity.this, SharePlatform.QZONE, "Title", "summary",
                        "http://www.google.com", "http://shaohui.me/images/avatar.gif",
                        mShareListener);
                break;
            case R.id.weibo:
                ShareUtil.shareImage(MainActivity.this, SharePlatform.WEIBO,
                        "http://shaohui.me/images/avatar.gif", mShareListener);
                break;
            case R.id.weixin:
                ShareUtil.shareMedia(MainActivity.this, SharePlatform.WX, "Title", "summary",
                        "http://www.google.com", "http://shaohui.me/images/avatar.gif",
                        mShareListener);
                break;
            case R.id.circle:
                ShareUtil.shareText(MainActivity.this, SharePlatform.WX_TIMELINE, "测试分享文字",
                        mShareListener);
                break;
            default:
                break;
        }
    }
}

效果图

ShareSDK

简介

ShareSDK 是社会化分享SDK,包括微信、朋友圈,微博,QQ,QQ空间等渠道分享。

使用

添加依赖

compile ('com.xyzlf.share:sharesdk:0.0.9') { exclude group: 'com.android.support', module: 'appcompat-v7' }

添加依赖之后就可以正常使用ShareSDK来实现社会化分享了,但是需要注意的是在使用微信分享的需要在包名下编写一个WXEntryActivity的activity,这是使用ShareSDK工具需要必须需要我们手动实现的,而WXEntryActivity也是分享到微信时,微信要求我们要做的事情。该activity必须要在包的名字为项目包名下,否则出错。具体可以参考这篇文章 分享SDK系列一:遇到的坑

WXEntryActivity:

/**
 * 这个类是微信回调的类
 */
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, ManifestUtil.getWeixinKey(this), false);
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq req) {

    }

    @Override
    public void onResp(BaseResp resp) {
        Intent intent = new Intent();
        intent.setAction(ShareConstant.ACTION_WEIXIN_CALLBACK);
        intent.putExtra(ShareConstant.EXTRA_WEIXIN_RESULT, resp.errCode);
        sendBroadcast(intent);
        finish();
    }
}
ShareUtil.showShareDialog调用ShareSDK的分享界面:
public void showShareDialog(View view) {
        ShareEntity testBean = new ShareEntity("我是标题", "我是内容,描述内容。");
        testBean.setUrl("https://www.baidu.com"); //分享链接
        testBean.setImgUrl("https://www.baidu.com/img/bd_logo1.png");
        ShareUtil.showShareDialog(this, testBean, ShareConstant.REQUEST_CODE);
    }
分享函数:

ShareUtil.startShare(this, ShareConstant.SHARE_CHANNEL_QQ, testBean, ShareConstant.REQUEST_CODE);

需要指定分享平台类型: 1、ShareConstant.SHARE_CHANNEL_QQ分享到qq聊天; 2、ShareConstant.SHARE_CHANNEL_QZONE分享到qq空间; 3、ShareConstant.SHARE_CHANNEL_SINA_WEIBO分享到微博; 4、ShareConstant.SHARE_CHANNEL_WEIXIN_FRIEND分享到微信; 5、ShareConstant.SHARE_CHANNEL_WEIXIN_CIRCLE分享到朋友圈。

需要在onActivityResult做回调处理
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    /**
     * 分享回调处理
     */
    if (requestCode == ShareConstant.REQUEST_CODE) {
        if (data != null) {
            int channel = data.getIntExtra(ShareConstant.EXTRA_SHARE_CHANNEL, -1);
            int status = data.getIntExtra(ShareConstant.EXTRA_SHARE_STATUS, -1);
            onShareCallback(channel, status);
        }
    }
}

activity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private ShareEntity testBean;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        testBean = new ShareEntity("我是标题", "我是内容,描述内容。");
        testBean.setUrl("https://www.baidu.com"); //分享链接
        testBean.setImgUrl("https://www.baidu.com/img/bd_logo1.png");

        findViewById(R.id.share_qq).setOnClickListener(this);
        findViewById(R.id.share_qzone).setOnClickListener(this);
        findViewById(R.id.share_weibo).setOnClickListener(this);
        findViewById(R.id.share_weixin).setOnClickListener(this);

        findViewById(R.id.share_bigimage).setOnClickListener(this);

    }

    /**
     * 分享界面
     */
    public void showShareDialog(View view) {
        ShareEntity testBean = new ShareEntity("我是标题", "我是内容,描述内容。");
        testBean.setUrl("https://www.baidu.com"); //分享链接
        testBean.setImgUrl("https://www.baidu.com/img/bd_logo1.png");
        ShareUtil.showShareDialog(this, testBean, ShareConstant.REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        /**
         * 分享回调处理
         */
        if (requestCode == ShareConstant.REQUEST_CODE) {
            if (data != null) {
                int channel = data.getIntExtra(ShareConstant.EXTRA_SHARE_CHANNEL, -1);
                int status = data.getIntExtra(ShareConstant.EXTRA_SHARE_STATUS, -1);
                onShareCallback(channel, status);
            }
        }
    }

    /**
     * 分享回调处理
     * @param channel
     * @param status
     */
    private void onShareCallback(int channel, int status) {
        new ShareCallBack().onShareCallback(channel, status);
    }

    @Override
    public void onClick(View view) {
        int id = view.getId();
        switch (id) {
            case R.id.share_qq:
                ShareUtil.startShare(this, ShareConstant.SHARE_CHANNEL_QQ, testBean, ShareConstant.REQUEST_CODE);
                break;
            case R.id.share_qzone:
                ShareUtil.startShare(this, ShareConstant.SHARE_CHANNEL_QZONE, testBean, ShareConstant.REQUEST_CODE);
                break;
            case R.id.share_weibo:
                ShareUtil.startShare(this, ShareConstant.SHARE_CHANNEL_SINA_WEIBO, testBean, ShareConstant.REQUEST_CODE);
                break;
            case R.id.share_weixin:
                ShareUtil.startShare(this, ShareConstant.SHARE_CHANNEL_WEIXIN_FRIEND, testBean, ShareConstant.REQUEST_CODE);
                break;
            case R.id.share_wxcircle:
                ShareUtil.startShare(this, ShareConstant.SHARE_CHANNEL_WEIXIN_CIRCLE, testBean, ShareConstant.REQUEST_CODE);
                break;

            //分享大图
            case R.id.share_bigimage:
                shareBigImg();
                break;
        }
    }

    /**
     * 分享大图,大图分享支持,微信,微信朋友圈,微博,QQ,其他渠道不支持
     *
     * 分享大图注意点
     * 1、setShareBigImg为ture
     * 2、QQ分享大图,只能是本地图片
     */
    public void shareBigImg() {
        ShareEntity testBean = new ShareEntity("", "");
        testBean.setShareBigImg(true);
        testBean.setImgUrl("/storage/sdcard0/Android/data/com.xyzlf.share/files/com.xyzlf.share_share_pic.png"); //本地地址

        /** 如果你要分享的图片是Bitmap,你可以如下使用 **/
//        Bitmap bitmap = null;
//        String filePath = ShareUtil.saveBitmapToSDCard(this, bitmap);
//        testBean.setImgUrl(filePath);

        int channel = ShareConstant.SHARE_CHANNEL_WEIXIN_FRIEND | ShareConstant.SHARE_CHANNEL_WEIXIN_CIRCLE | ShareConstant.SHARE_CHANNEL_SINA_WEIBO | ShareConstant.SHARE_CHANNEL_QQ;
        ShareUtil.showShareDialog(this, channel, testBean, ShareConstant.REQUEST_CODE);
    }

}

ShareCallBack:

public class ShareCallBack {

    /**
     * @param channel
     * @param status
     */
    public void onShareCallback(int channel, int status) {
        switch (channel) {
            case ShareConstant.SHARE_CHANNEL_WEIXIN_FRIEND:
            case ShareConstant.SHARE_CHANNEL_WEIXIN_CIRCLE:
                onWeixinCallBack(status);
                break;

            case ShareConstant.SHARE_CHANNEL_SINA_WEIBO:
                onWeiboCallBack(status);
                break;

            case ShareConstant.SHARE_CHANNEL_QQ:
                onQQCallBack(status);
                break;

            case ShareConstant.SHARE_CHANNEL_QZONE:
                onQZoneCallBack(status);
                break;

            case ShareConstant.SHARE_CHANNEL_SYSTEM:
                onSystemCallBack(status);
                break;
        }
    }

    /** 没有取消状态 **/
    private void onWeixinCallBack(int status) {
        switch (status) {
            /** 成功 **/
            case ShareConstant.SHARE_STATUS_COMPLETE:

                break;
            /** 失败 **/
            case ShareConstant.SHARE_STATUS_FAILED:

                break;
        }
    }

    /**
     * 以下有成功,失败,取消三种回调结果
     * @param status
     */
    private void onWeiboCallBack(int status) {
        switch (status) {
            /** 成功 **/
            case ShareConstant.SHARE_STATUS_COMPLETE:

                break;
            /** 失败 **/
            case ShareConstant.SHARE_STATUS_FAILED:

                break;
            /** 取消 **/
            case ShareConstant.SHARE_STATUS_CANCEL:

                break;
        }
    }

    private void onQQCallBack(int status) {

    }

    private void onQZoneCallBack(int status) {
    }


    /** 系统分享,回调结果没有实际意义,因为不能知道用户是否发送短信了,是否发送邮件了 **/
    private void onSystemCallBack(int status) {
    }
    /** 系统分享,回调结果没有实际意义,因为不能知道用户是否发送短信了,是否发送邮件了 **/

}

可以到githut下载demo,详细了解作者如何实现。

ShareLoginLib

简介

ShareLoginLib 是社会化分享工具,帮助开发着实现内容分享到微信、微博和qq社交平台。

添加依赖

1、在项目外层的build.gradle中添加JitPack仓库

repositories { // ... maven { url "https://jitpack.io" } }

2、在用到的项目中添加依赖

compile 'com.github.tianzhijiexian:ShareLoginLib:1.3.8'

3、初始化配置

SlConfig cfg = new SlConfig.Builder()
                .debug(false)
                .appName("ShareLoginDemo")
                .picTempFile(null)
                .qq(QQ_APPID, QQ_SCOPE)
                .weiBo(WEIBO_APPID, WEIBO_REDIRECT_URL, WEIBO_SCOPE)
                .weiXin(WEIXIN_APPID, WEIXIN_SECRET)
                .build();

ShareLoginSDK.init(this, cfg);

初始化配置在好在application的onCreate初始化。

public class BaseApplication extends Application {

    private static final String TAG = "Application";

    protected static String QQ_APPID, QQ_SCOPE,
            WEIBO_APPID, WEIBO_SCOPE, WEIBO_REDIRECT_URL,
            WEIXIN_APPID, WEIXIN_SECRET;

    @Override
    public void onCreate() {
        super.onCreate();

        initConstant();

        Log.d(TAG, "onCreate: weixin:" + ShareLoginSDK.isWeiXinInstalled(this));
        Log.d(TAG, "onCreate: weibo:" + ShareLoginSDK.isWeiBoInstalled(this));
        Log.d(TAG, "onCreate: qq:" + ShareLoginSDK.isQQInstalled(this));

        SlConfig cfg = new SlConfig.Builder()
                .debug(false)
                .appName("ShareLoginDemo")
                .picTempFile(null)
                .qq(QQ_APPID, QQ_SCOPE)
                .weiBo(WEIBO_APPID, WEIBO_REDIRECT_URL, WEIBO_SCOPE)
                .weiXin(WEIXIN_APPID, WEIXIN_SECRET)
                .build();

        ShareLoginSDK.init(this, cfg);
    }

    /**
     * 初始化一些常量
     */
    protected void initConstant() {
        QQ_APPID = "xxxxxxxxxxxx";
        QQ_SCOPE = "xxxxxxxxxxxx";
        WEIBO_APPID = "xxxxxxxxxxxx";
        WEIBO_REDIRECT_URL = "xxxxxxxxxxxx";
        WEIXIN_APPID = "xxxxxxxxxxxx";
        WEIXIN_SECRET = "xxxxxxxxxxxx";
        WEIBO_SCOPE = "xxxxxxxxxxxx";
    }
}

4、分享

SsoShareManager.share(this, SsoShareType.QQ_ZONE, mShareContent, mShareListener);

指定分享类型SsoShareType.QQ_ZONE,并且设置分享监听。

5、登录

SsoLoginManager.login(this, SsoLoginType.WEIBO, new LoginListener(this, SsoLoginType.WEIBO));

指定登陆类型以及设置登录监听。

MainActivity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private SsoShareManager.ShareStateListener mShareListener;
    private ShareContent mShareContent;
    private Bitmap thumbBmp = null;
    private Bitmap largeBmp = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        thumbBmp = ((BitmapDrawable) getResources().getDrawable(R.drawable.kale)).getBitmap();
        largeBmp = ((BitmapDrawable) getResources().getDrawable(R.drawable.large)).getBitmap();
        mShareContent = new ShareContentWebPage("title","summary", "http://www.kale.com",thumbBmp, largeBmp);


        this.findViewById(R.id.share_qq).setOnClickListener(this);
        this.findViewById(R.id.share_qqzone).setOnClickListener(this);
        this.findViewById(R.id.share_weibo).setOnClickListener(this);
        this.findViewById(R.id.share_weixin).setOnClickListener(this);
        this.findViewById(R.id.share_circle).setOnClickListener(this);

        this.findViewById(R.id.login_qq).setOnClickListener(this);
        this.findViewById(R.id.login_weibo).setOnClickListener(this);
        this.findViewById(R.id.login_weixin).setOnClickListener(this);


        initListener();
    }

    private void initListener() {

        mShareListener = new SsoShareManager.ShareStateListener(){
            @Override
            public void onSuccess() {
                super.onSuccess(); // must call super
            }

            @Override
            public void onCancel() {
                super.onCancel(); // must call super
            }

            @Override
            public void onError(String msg) {
                super.onError(msg); // must call super
            }
        };

    }

    public void onGotUserInfo(String info, String headImgUrl) {


    }


    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            case R.id.share_qq:
                SsoShareManager.share(MainActivity.this, SsoShareType.QQ_FRIEND, mShareContent, mShareListener);
                break;
            case R.id.share_qqzone:
                SsoShareManager.share(this, SsoShareType.QQ_ZONE, mShareContent, mShareListener);
                break;
            case R.id.share_weibo:
                SsoShareManager.share(this, SsoShareType.WEIBO_TIME_LINE, mShareContent, mShareListener);
                break;
            case R.id.share_weixin:
                SsoShareManager.share(this, SsoShareType.WEIXIN_FRIEND, mShareContent, mShareListener);
                break;
            case R.id.share_circle:
                SsoShareManager.share(this, SsoShareType.WEIXIN_FRIEND_ZONE, mShareContent, mShareListener);
                break;
            case R.id.login_qq:
                SsoLoginManager.login(this, SsoLoginType.QQ, new LoginListener(this, SsoLoginType.QQ));
                break;
            case R.id.login_weibo:
                SsoLoginManager.login(this, SsoLoginType.WEIBO, new LoginListener(this, SsoLoginType.WEIBO));
                break;
            case R.id.login_weixin:
                SsoLoginManager.login(this, SsoLoginType.WEIXIN, new LoginListener(this, SsoLoginType.WEIXIN));
                break;

            default:
                break;
        }

    }

    public void handResult(String result) {
    }
}

LoginListener:这是作者在demo中的登录回调接口

class LoginListener extends SsoLoginManager.LoginListener {

    private static final String TAG = "LoginListener";

    private MainActivity activity;

    private
    @SsoLoginType
    String type;

    LoginListener(MainActivity activity, @SsoLoginType String type) {
        this.activity = activity;
        this.type = type;
    }

    @Override
    public void onSuccess(String accessToken, String userId, long expiresIn, String data) {
        super.onSuccess(accessToken, userId, expiresIn, data);
        Log.d(TAG, "accessToken = " + accessToken + "\nuid = " + userId + "\nexpires_in = " + expiresIn);
        loadUserInfo(accessToken, userId);

        String result = "登录成功";
        Toast.makeText(activity, result, Toast.LENGTH_SHORT).show();
        activity.handResult(result);
    }

    @Override
    public void onError(String msg) {
        super.onError(msg);
        String result = "登录失败,失败信息:" + msg;
        Toast.makeText(activity, result, Toast.LENGTH_SHORT).show();
        activity.handResult(result);
    }

    @Override
    public void onCancel() {
        super.onCancel();
        String result = "取消登录";
        Toast.makeText(activity, result, Toast.LENGTH_SHORT).show();
        activity.handResult(result);
    }

    /**
     * 加载用户的个人信息
     */
    private void loadUserInfo(String accessToken, String userId) {
        SsoUserInfoManager.getUserInfo(activity, type, accessToken, userId, new SsoUserInfoManager.UserInfoListener() {
            @Override
            public void onSuccess(@NonNull final OAuthUserInfo userInfo) {
                final String info = " nickname = " + userInfo.nickName + "\n"
                        + " sex = " + userInfo.sex + "\n"
                        + " id = " + userInfo.userId;

                activity.onGotUserInfo(info, userInfo.headImgUrl);
            }

            @Override
            public void onError(String msg) {
                activity.onGotUserInfo(" 出错了!\n" + msg, null);
            }
        });
    }
}

以上是github上比较流行的分享工具,接下来我们自己使用微信、微博和qq的分享api手动实现分享功能。

手动实现分享功能

1、到微信、微博和qq的开放平台,注册id

2、将分享sdk加入到项目的lib目录下,微信的sdk也可以在项目下的build.gradle文件添加依赖: compile 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:1.0.2'

myshare

mshare

qq分享和qq空间分享

1)、在AndroidManifest.xml中注册qq的activity

 <!-- QQ SDK 需要註冊Activity -->
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:label="@string/app_name"
            android:launchMode="singleTask"






请到「今天看啥」查看全文