简介
如今的app中,几乎都包含了分享这个功能,十分的常用
常见实现方式:
1. 系统自带分享
2. 使用社会化分享组件(如shareSDK等)
3. 集成三方SDK(QQ,微信,微博等)
android的自带分享功能功能太过单一,不能满足复杂的业务需求,这里主要介绍一下ShareSdk 和 集成三方SDK的方式
ShareSdk使用及注意事项
App Key App Secret
首先需要注册ShareSDK账号,并在后台创建应用,获取获取App Key
和App Secret
,应用名后期可更改,App Key
和App Secret
则不会改变
SDK下载及导入
选择我们需要分享到的平台 ,或者直接下载官方Demo.
在刚才下载的SDK中,找到快速集成程序,QuickIntegrater.jar
,按照相应操作,即可生成相关集成所需文件,点击确定后,会生成一个Sample
目录.将目录中的文件拷贝到项目中,
相关配置
这里的分享渠道参数配置有三种方式,分别是 在后台, 代码中,ShareSDK.xml中
其中最简单,最常用的就是在ShareSDK.xml中配置
ShareSDK.xml
放置在资产目录assets下
这种方式的弊端就是在应用发出去后不可动态更改
然后添加清单文件中的权限配置和 activity回调配置
分享及回调
//Activity#onCreate()
//使用ShareSDK.xml方式配置
ShareSDK.initSDK(this);
// 使用代码或者应用后台配置
ShareSDK.initSDK(this,”androidv1101″);
//androidv1101:是你的应用在ShareSDK注册应用信息时返回的AppKey
//share
private void showShare(Context context,PlatformActionListener listener){
OnekeyShare oks = new OnekeyShare();
//...
//设置内容回调,用于自定义不同平台的字段内容
oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback());
//设置回调监听
oks.setCallback(listener);
//设置自定义图标
oks.setCustomerLogo(press, nomal, label,listener);
oks.show(context);
}
//Activity#onDestroy()
ShareSDK.stopSDK(this);
官方SDK 分享
这里我们自己使用QQ ,微信和微博的SDK来进行分享,并进行一定的封装,
QQ分享
什么首先获取appid等等,这些都是一般的流程.QQ分享主要用到类QQShare
//初始化
mTencent = Tencent.createInstance(qqAppId, activity);
this.mQQShare = new QQShare(activity, mTencent.getQQToken());
//分享
/**
* 设置分享内容
* 参数说明
* QzoneShare.SHARE_TO_QQ_KEY_TYPE 选填 Int SHARE_TO_QZONE_TYPE_IMAGE_TEXT(图文)
* QzoneShare.SHARE_TO_QQ_TITLE 必填 Int 分享的标题,最多200个字符。
* QzoneShare.SHARE_TO_QQ_SUMMARY 选填 String 分享的摘要,最多600字符。
* QzoneShare.SHARE_TO_QQ_TARGET_URL 必填 String 需要跳转的链接,URL字符串。
* QzoneShare.SHARE_TO_QQ_IMAGE_URL 选填 String 分享的图片, 以ArrayList<String>的类型传入,以便支持多张图片(注:图片最多支持9张图片,多余的图片会被丢弃)。
*/
//其中bundle中传入的就是上面的那些参数,baseUiListener是为回调
mQQShare.shareToQQ(mActivity, bundle, baseUiListener);
微信分享
微信分享依靠 的是IWXAPI来完成的,其中提供了几个类来辅助构建分享内容
- WXTextObject: 文本内容
- WXImageObject: 图片内容
- WXWebpageObject: 网页内容
- WXMusicObject: music内容
//init
mIWXAPI = WXAPIFactory.createWXAPI(activity, weChatAppId, true);
mIWXAPI.registerApp(weChatAppId);
// 构建分享内容
WXMediaMessage msg = new WXMediaMessage(music);
msg.title = shareContent.getTitle();
msg.description = shareContent.getContent();
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = String.valueOf(System.currentTimeMillis());
req.message = msg;
//开始分享
mIWXAPI.sendReq(req);
注意:微信分享需要签名,并且新建wxapi/WXEntryActivity.java
微博分享
参照sinaweibosdk/weibo_android_sdk,同样微博也提供了文本,图片,webpage和music的分享.
private void shareText(ShareContent shareContent) {
//初始化微博的分享消息
WeiboMultiMessage weiboMultiMessage = new WeiboMultiMessage();
weiboMultiMessage.textObject = getTextObj(shareContent.getContent());
//初始化从第三方到微博的消息请求
SendMultiMessageToWeiboRequest request = new SendMultiMessageToWeiboRequest();
request.transaction = String.valueOf(System.currentTimeMillis());
request.multiMessage = weiboMultiMessage;
share(mActivity, request);
}
// 使用网页分享时会触发回调
mSinaAPI.sendRequest((Activity) context, request, authInfo, token, weiboAuthListener);
注意使用客户端分享的时候,需要回调activity
实现IWeiboHandler.Response
,并在清单文件下配置
<intent-filter>
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
封装
最后,为了方便使用,这里对三方分享进行了一定的封装ShareLoginPay,只要配置好appid等配置信息即可.
//以微信分享为例
LoginBlock.getInstance().initWechatLogin(wechatAppId, wechatAppSecret);
IShare wxshare = new WechatShare(this);
ShareContent shareContent = new ShareContent();
shareContent.setContent("分享的内容");
shareContent.setTitle("分享的标题");
//分享文本
shareContent.setContentType(ContentType.TEXT);
//分享到好友,而不是朋友圈
shareContent.setShareType(ShareType.WECHAT);
wxshare.share(shareContent, new IShareCallBack() {
@Override public void onComplete(Object o) {
Toast.makeText(MainActivity.this, "onComplete-->" + o.toString(), Toast.LENGTH_SHORT)
.show();
}
@Override public void onError(Exception e) {
Toast.makeText(MainActivity.this, "onError-->" + e.toString(), Toast.LENGTH_SHORT).show();
}
@Override public void onCancel() {
Toast.makeText(MainActivity.this, "onCancel", Toast.LENGTH_SHORT).show();
}
});