以前移动端要做分享的时候一般是两种方法,要么使用Intent调用安卓系统自带的分享功能接口,这是最简单快捷的方法, 要么就自己去QQ微信和各个微博等社交网站申请开发者ID和key,然后在看他们的官方文档,在手机上逐个去实现.所以几年前应用内置的分享一般只支持主流的几个社交点 比如QQ,微信和新浪微博几个. 但人总是寻找最优化的解决方案,于是随着技术的成熟,集成类的社会化分享已经成为主流,只要在各大社交站点的开发者平台申请了所需的账号和KEY, 就能在一个第三方的平台通过简单的参数设置和方法调用实现几乎所有社会化的分享,所以现在在各个新闻APP浏览新闻,点击分享当前新闻的时候就会弹出一大堆支持分享的,甚至支持twitter,Facebook 和Google+ 等等.
目前国内社会化分享组件做的比较好的是ShareSDK, 友盟 和百度等平台.个人综合使用后选择了友盟服务,因为友盟除了社会化分享做的比较成熟,另外还提供了统计,自动更新,消息推送,反馈等服务,只要一个账号就能同时使用他们提供的这些服务哦.
有点扯远了,下面开始,先做点准备功夫, 然后通过代码实现友盟分享到微信好友和微信朋友圈:
一,准备功夫
1, 当然, 先去友盟官方注册一个账号
2, 有了账号登陆,在首页会看到这个界面:
选择 "社会化分享" --> 选择 "SDK下载" 或者直接点这里 下载SDK.
就会有勾选下载的界面:
因为本次只用到微信和新浪微博.所以默认勾选的就够用了.
下载之后,将几个jar包放到项目的libs文件夹中,
同时把下载的所有图片素材和XML文件都拷贝到对应的项目文件夹中,umeng_socialize_strings.xml在复制的时候可能会因为国际化的原因出错,自己可以根据需要去修改这个文件的内容,对功能没啥影响的.
微信分享是略微特殊的,需要一个WXEntryActivity.java的文件,里面是空实现,只在实现微信分享时作回调用.将下载的名为wxapi文件夹中的WXEntryActivity.java复制到项目类包的任意位置即可,最好是方便归类寻找的包.
3, 看看官方的文档说明, 你会发现 友盟服务实现分享到微信是非常简单的~ 这里继续把最后的准备功夫做好 -- 在AndroidManifest.xml文件中进行配置, 官方文档说明很清晰,这里直接套用一下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.umeng.example"
android:versionCode="1"
android:versionName="1.0" >
<application
android:debuggable="true"
android:icon="@drawable/icon"
android:label="@string/app_name"
android:theme="@android:style/Theme.Black.NoTitleBar" >
<!-- ###################注册SDK使用的Activity###################### -->
<!--分享编辑页-->
<activity
android:name="com.umeng.socialize.view.ShareActivity"
android:configChanges="orientation|keyboard"
android:launchMode="singleTask"
android:noHistory="true"
android:theme="@style/Theme.UMDialog"
android:windowSoftInputMode="stateVisible|adjustResize" >
</activity>
<!-- ############ QQ空间和QQ SSO授权的Activity注册 ############ -->
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<!-- 100424468,如果你使用的公用账号,则不需要修改;否则修改成你在QQ开放平台申请的 APP ID-->
<data android:scheme="tencent100424468" />
</intent-filter>
</activity>
<activity android:name="com.tencent.connect.common.AssistActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:screenOrientation="portrait">
</activity>
<!-- ###################添加UmengAppkey###################### -->
<meta-data
android:name="UMENG_APPKEY"
android:value="xxxxxxxxxxxxxxxxxxxxxx" >
</meta-data>
</application>
<uses-sdk android:minSdkVersion="8" />
<!-- ###################声明SDK使用的相关权限###################### -->
<!-- 检测网络状态 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 获取mac地址作为用户的备用唯一标识 --
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 获取用户手机的IMEI,用来唯一的标识用户 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 缓存资源优先存入SDcard -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 允许应用程序联网,以便向我们的服务器端发送数据 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- QQ、QQ空间所需权限 -->
<uses-permission android:name="android.permission.GET_TASKS" />
</manifest>
二,自定义微信好友和朋友圈分享
友盟提供了默认的分享界面. 但我们是要自定义,所以分享界面怎么实现,自己根据需要去写布局喇.
这里准备好早已申请到微信的appID和appSecret:
根据文档, 写个方法:
/**
* 添加微信到分享列表
* @author Mr.Et
* @说明 代码必须在弹出分享面板前调用
*/
private void prepareForWechatShare(){
// 添加微信平台
UMWXHandler wxHandler = new UMWXHandler(this,MyConstant.appID,MyConstant.appSecret);
wxHandler.addToSocialSDK();
// 支持微信朋友圈
UMWXHandler wxCircleHandler = new UMWXHandler(this,MyConstant.appID,MyConstant.appSecret);
wxCircleHandler.setToCircle(true);
wxCircleHandler.addToSocialSDK();
}
上面这个方法名自己随便起,在Activity初始化的时候就去调用它,将微信分享添加到友盟的分享列表中.
Activity类中添加友盟分享Controller
/**友盟分享Controller**/
private final UMSocialService mController =
UMServiceFactory.getUMSocialService("com.umeng.share",RequestType.SOCIAL);
1,分享到微信好友
这里自定义2个方法实现分享到微信好友的功能,代码中有注释,应该很容易看懂.
/**
* 设置微信好友分享内容
*/
public static void shareToWebchatFriend(Context context,final UMSocialService mController,String contentStr
,String subject,String threadUrl,String imageUrl){
WeiXinShareContent weixinContent = new WeiXinShareContent();
//设置分享文字
weixinContent.setShareContent(contentStr);
//设置title
weixinContent.setTitle(subject);
//设置分享内容跳转URL
weixinContent.setTargetUrl(threadUrl);
//设置分享图片
UMImage img;
if(imageUrl != null ){
// img = new UMImage(context,
// "http://d.hiphotos.baidu.com/image/w%3D2048/sign=1b1f93ad533d26972ed30f5d61c3b3fb/023b5bb5c9//ea15ce8d204e6eb4003af33b87b28f.jpg");
img = new UMImage(context, imageUrl);
}else{
img = new UMImage(context, R.drawable.ic_launcher);
}
weixinContent.setShareImage(img);
mController.setShareMedia(weixinContent);
setShareWechatBtn(context,mController);
}
/**
* 分享给微信某个朋友 - 监听器
*/
private static void setShareWechatBtn(final Context context,final UMSocialService mController){
mController.postShare(context,SHARE_MEDIA.WEIXIN,
new SnsPostListener() {
@Override
public void onStart() {
UIHelper.ToastMessageShort(context, "开始分享");
}
@Override
public void onComplete(SHARE_MEDIA arg0, int eCode,
SocializeEntity arg2) {
if (eCode == 200) {
UIHelper.ToastMessageShort(context, "分享成功");
} else {
String eMsg = "";
if (eCode == -101){
eMsg = "没有授权";
}
UIHelper.ToastMessageShort(context, "分享失败[" + eCode + "] " + eMsg);
}
}
});
}
上面代码中,UMImage 就是分享到微信的标题旁边那个小图片, 它支持图片URL也支持项目资源的图片ID来创建.
2,分享到微信朋友圈
分享到朋友圈和到微信好友其实很类似,只是新建的对象不一样.后面分享到微博其实也同样原理.
/**
* 设置微信朋友圈分享内容
*/
public static void shareToWechatAllFriends(Context context,final UMSocialService mController,String contentStr
,String subject,String threadUrl,String imageUrl){
//CircleShareContent是和分享到微信好友不同的地方
CircleShareContent circleMedia = new CircleShareContent();
circleMedia.setShareContent(contentStr);
//设置朋友圈title
circleMedia.setTitle(subject);
//设置分享图片
UMImage img;
if(imageUrl != null ){
img = new UMImage(context, imageUrl);
}else{
img = new UMImage(context, R.drawable.ic_launcher);
}
circleMedia.setShareImage(img);
circleMedia.setTargetUrl(threadUrl);
mController.setShareMedia(circleMedia);
setShareWechatAllFrdsBtn(context,mController);
}
/**
* 分享给微信朋友圈 - 监听器
* @param context
* @param mController
*/
private static void setShareWechatAllFrdsBtn(final Context context,final UMSocialService mController){
mController.postShare(context,SHARE_MEDIA.WEIXIN_CIRCLE,
new SnsPostListener() {
@Override
public void onStart() {
UIHelper.ToastMessageShort(context, "开始分享");
}
@Override
public void onComplete(SHARE_MEDIA arg0, int eCode,
SocializeEntity arg2) {
if (eCode == 200) {
UIHelper.ToastMessageShort(context, "分享成功");
} else {
String eMsg = "";
if (eCode == -101){
eMsg = "没有授权";
}
UIHelper.ToastMessageShort(context, "分享失败[" + eCode + "] " + eMsg);
}
}
});
}
3,分享到新浪微博和豆瓣
想看文档了解的童鞋,可以点这里 不妨先去看看官方文档进一步了解.
类似豆瓣这些第三方分享,在分享前还需要检测是否已经获得授权,否则无法实现分享.
/**
* 检测是否已获取豆瓣授权
*/
public static void checkDBRightToShare(){
if(OauthHelper.isAuthenticated(this,SHARE_MEDIA.DOUBAN)){ //已获得授权
ShareUtils.ShareToDouBan(this, loginController
, contentStr, subject, threadUrl, imageUrl);
}else{ //先登录获取授权,再分享
ShareUtils.LoginDouBan(this, loginController
, contentStr, subject, threadUrl, imageUrl);
}
}
如果没获取授权,就显示登录界面进行登录,然后获取授权:
/**
* 第三方登录 - 豆瓣授权登录
*/
///** loginController是针对需要第三方登录授权分享的功能,比如豆瓣,新浪微博,腾讯微博,QQ,Qzone等 **/
//private UMSocialService loginController = UMServiceFactory.getUMSocialService("com.umeng.login");
public static void LoginDouBan(final Context mContext,final UMSocialService mController,final String contentStr
,final String subject,final String threadUrl,final String imageUrl){
mController.doOauthVerify(mContext, SHARE_MEDIA.DOUBAN, new UMAuthListener() {
@Override
public void onStart(SHARE_MEDIA arg0) {
// TODO Auto-generated method stub
}
@Override
public void onError(SocializeException arg0, SHARE_MEDIA arg1) {
// TODO Auto-generated method stub
}
@Override
public void onComplete(Bundle value, SHARE_MEDIA platform) {
if (value != null && !TextUtils.isEmpty(value.getString("uid"))) {
UIHelper.ToastMessageShort(mContext, "授权成功");
ShareUtils.ShareToDouBan(mContext, mController
,contentStr, subject, threadUrl, imageUrl);
// GetPlatformInfoOfDouBan();
} else {
UIHelper.ToastMessageShort(mContext, "授权失败");
}
}
@Override
public void onCancel(SHARE_MEDIA arg0) {
// TODO Auto-generated method stub
}
});
}
最后进行实现分享~
/**
* 分享到豆瓣
* @param mContext
* @param mController
* @param contentStr
* @param subject
* @param threadUrl
* @param imageUrl
*/
public static void ShareToDouBan(final Context mContext,final UMSocialService mController,String contentStr
,String subject,String threadUrl,String imageUrl){
//设置分享图片,(因为分享到豆瓣 不需要使用图片,所以注释了. 但如果是分享到微博,将这些注释全部去掉即可)
// UMImage img;
// if(imgAid != null ){
// img = new UMImage(mContext, imageUrl);
// }else{
// img = new UMImage(mContext, R.drawable.ic_launcher);
// }
// mController.setShareImage(UMImage);
//设置分享内容
mController.setShareContent("「"+subject + "」, " + threadUrl+" (分享自@Mr.Et)");
//直接分享
//如果是新浪微博等,将SHARE_MEDIA.DOUBAN 改成 SHARE_MEDIA.SINA 即可
mController.directShare(mContext, SHARE_MEDIA.DOUBAN,
new SnsPostListener() {
@Override
public void onStart() {
UIHelper.ToastMessageShort(mContext, "分享开始");
}
@Override
public void onComplete(SHARE_MEDIA platform,int eCode, SocializeEntity entity) {
if(eCode == StatusCode.ST_CODE_SUCCESSED){
UIHelper.ToastMessageShort(mContext, "分享成功");
}else{
UIHelper.ToastMessageShort(mContext, "分享失败");
}
}
});
}
其他诸如腾讯微博等分享其实都使用以上类似的方式去实现,触类旁通,多实践多尝试就熟悉了.
下面附上分享到豆瓣的截图 ^^