> >

Android 分享到指定平台

注意:
本文介绍的是调用ShareSDK的内置(无界面)方法的实现分享功能。如果您想查询“快捷分享”(有界面)的接口调用方法,请参考“快捷分享及其自定义” 分享前请阅读不同平台分享内容的详细说明

1、分享到指定平台

ShareSDK的分享功能由Platform的share(ShareParams params)方法完成上。下面分别使用新浪微博和QQ空间作为例子,举例如何利用此方法实现分享功能。

1)新浪微博

ShareParams sp = new ShareParams();
sp.setText(“测试分享的文本”);
sp.setImagePath(“/mnt/sdcard/测试分享的图片.jpg”);

Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.setPlatformActionListener(paListener); // 设置分享事件回调
// 执行图文分享
weibo.share(sp);

2)QZone

ShareParams sp = new ShareParams();
sp.setTitle("测试分享的标题");
sp.setTitleUrl("http://sharesdk.cn"); // 标题的超链接
sp.setText("测试分享的文本");
sp.setImageUrl("http://www.someserver.com/测试图片网络地址.jpg");
sp.setSite("发布分享的网站名称");
sp.setSiteUrl("发布分享网站的地址");

Platform qzone = ShareSDK.getPlatform (QZone.NAME);
// 设置分享事件回调(注:回调放在不能保证在主线程调用,不可以在里面直接处理UI操作)
qzone.setPlatformActionListener (new PlatformActionListener() {
	public void onError(Platform arg0, int arg1, Throwable arg2) {
		//失败的回调,arg:平台对象,arg1:表示当前的动作,arg2:异常信息
	}
	public void onComplete(Platform arg0, int arg1, HashMap<String, Object> arg2) {
		//分享成功的回调
	}
	public void onCancel(Platform arg0, int arg1) {
		//取消分享的回调
	}
});
// 执行图文分享
qzone.share(sp);

ShareParams是Platform 的内部类,提供了ShareSDK实现分享的数据体,ShareParams内部是一个HashMap,对外通过setter/getter提供ShareSDK能支持的所有分享字段。由于不同平台所支持的分享字段并不一样,因此分享前弄清楚这些字段十分有必要。关于不同平台所能支持的分享字段的详细列表,请参考 不同平台分享内容详细说明
执行分享前ShareSDK会自行判断平台是否已经授权,若未授权,会自行执行授权操作。

2、ShareParams字段释义

ShareSDK的每一个平台都有自己的ShareParams,由于平台差异,不同平台之间的ShareParams字段数量不一样,但是同样名称的字段都表示相同的含义,下面是当前ShareSDK所有平台ShareParams的字段的名称和代表的含义:

字段名称 描述
 text  待分享的文本
 imagePath  待分享的本地图片。如果目标平台使用客户端分享,此路径不可以在/data/data下面
 filePath  待分享的文件路径。这个用在Dropbox和Wechat中
 title  分享内容的标题
 notebook  存放笔记的笔记本,如果不存在,会创建。一般用在印象笔记等“笔记类”平台中
 stack  印象笔记中的字段,用于归类笔记本
 resource  印象笔记中的字段,数组,暂时支持String类型和File类型的元素。如果想一次发送多个文本和图片,需要使用这个字段
 tags  标签,数组,部分平台支持为分享内容设置标签,可以使用这个字段
 isPublic  印象笔记和flickr的字段,表示是否公开
 isFriend  flickr和VK的字段,表示是否公开给自己的朋友
 isFamily  flickr的字段,表示是否公开给自己的家人
 safetyLevel  flickr的字段,表示安全级别:1为安全级、2为辅导级、3为限制级
 contentType  flickr的字段,表示相册类型:1为相片、2为屏幕截图、3为其他
 hidden  flickr的字段,表示是否隐藏图片
 venueName  foursquare的字段,表示分享位置的名称
 venueDescription  foursquare的字段,表示分享位置的描述
 latitude  分享位置的维度
 longitude  分享位置的经度
 imageUrl  待分享的网络图片
 comment  对分享内容的评价。区别于text,评论一般共应用的用户自己填写,部分平台支持此字段
 titleUrl  分享内容标题的链接地址
 url  分享内容的url、在微信和易信中也使用为视频文件地址
 address  邮箱地址或者短信电话号码,一般在邮箱或者短信中使用
 site  QQ空间的字段,标记分享应用的名称
 siteUrl  QQ空间的字段,标记分享应用的网页地址
 gropuId  VK的字段,表示图片所属的组ID。如果不设置此字段,ShareSDK会将组ID设置为ShareSDK所在的组
 extInfo  Wecaht的字段,分享应用时,可以选择分享二进制文件或者脚本,此字段用来设置分享应用中的脚本
 shareType  微信和易信的字段,分享内容的类型:
分别为Platform.SHARE_TEXT(分享文本),
Platform.SHARE_IMAGE(分享图片),
Platform.SHARE_WEBPAGE(分享网页,既图文分享),
Platform.SHARE_MUSIC(分享音频),
Platform.SHARE_VIDEO(分享视频),
Platform.SHARE_APPS(分享应用,仅微信支持),
Platform.SHARE_FILE(分享文件,仅微信支持)
Platform.SHARE_EMOJI(分享表情,仅微信支持)
 musicUrl  微信和易信的字段,分享音频时的音频文件网络地址
 imageData  微信和易信的字段,各类分享内容中的图片bitmap对象,可以替代imagePatd或者imageUrl
 autdor  有道云笔记的字段,表示分享内容的作者
 customFlag  自定义分享标签

上述字段中和本地路径有关的,全部使用“Path”结尾,如imagePath;和网络路劲有关的,使用“Url”结尾,如imageUrl。本地图片最好使用后缀名,否则POST文件时,可能无法正确计算文件的MIME值,从而导致发送失败。

3、新浪微博发送网络图片

新浪微博支持分享网络图片,但是这个需要高级微博写入权限,因此如果您需要分享网络图片,请申请权限以后,将图片Url设置给SinaWeibo.ShareParams.setImageUrl(imageUrl)即可。下面详细描述一下申请此权限的方法:
1)进入您的应用详情,并选择“接口管理”—“申请权限”。
2)在右侧展开的页面中展开“微博高级写入接口”,会看到“statuses/upload_url_text”。勾选分组左侧的复选框。
3)滚动页面到底部,填写申请理由,然后“提交申请”。
wiki_and_share_1

完成上述步骤已经,您的申请就会进入新浪微博的审核程序,一般3个工作日以后可以得到审核结果。当接口权限被审核通过,您的应用就具备发送网络图片的功能了

4、人人网和QQ空间发送网络图片

人人网和QQ空间已经支持分享本地图片功能,可以通过imagePath字段为其设置本地图片。不过这些平台都需要特定的权限才能分享本地图片,因此请确保您的应用已经申请了足够的权限。请注意:对于人人网和QQ空间来说,imageUrl存在的时候,原来的imagePath将被忽略,但是新浪微博刚好相反,故须要特别注意。

5、QQ客户端分享

QQ客户端分享,或者使用QQ客户端完成QQ空间的分享,如果想得到分享回调,需要在MobUIShell中配置如下的intent-filter:

<activity
android:name="com.mob.tools.MobUIShell"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:windowSoftInputMode="stateHidden|adjustResize" >
<!--
如果集成QQ分享,或者使用QQ客户端来进行QQ空间的
分享,须要在此处添加一个对ACTION_VIEW事件的过滤器,
其中的scheme是“tencent”前缀再开发者应用的加上appId。
如果此过滤器不设置,则分享结束以后不能得到正确的回调
-->
<intent-filter>
<data android:scheme="tencent100371282" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>

QQ客户端会在分享结束后通过这个filter的scheme回调您的应用,因此如果您没有注册这个filter,或者scheme写错了,甚至使用的是别人的appid,有可能导致没有回调、回调失败,甚至回调的时候突然弹出一个应用选择窗,让用户选择处理回调的应用。

6、微信的分享回调

微信和微信好友圈的分享要求在您的项目中注册它的一个回调Activity,并将回调Actiity添加到您的代码中。其操作如下:
1)打开AndroidManifest.xml,参考配置AndroidManifest.xml章节的说明,配置回调WXEntryActivity。
2)复制SDK解压目录下Src中的wxapi包到您的项目中。

7、使用印象笔记客户端完成分享

由于部分开发者要求印象笔记在目标设备已经安装了印象笔记客户端的时候,直接使用印象笔记客户端来分享,因此最新版本的ShareSDK已经提供了此项支持。开发者可以通过到印象笔记的应用信息中修改字段“ShareByAppClient”的值来实现:true,表示优先使用客户端分享。
不过ShareByAppClient只会印象分享方式,而不能影响授权方式,印象笔记暂无SSO功能,因此如果您使用印象笔记完成授权,依然会跳往Web授权方式。

8、绕开审核机制

微博、微信等平台的分享是需要先到目标平台上申请应用信息,通过审核了才能使用的。且不说审核可能会比较长久和繁杂,有时候可能因为目标平台的一些政策也可能导致您的应用长时间不能被审核通过。为了避免这个问题,ShareSDK提供了临时绕开目标平台审核机制的方法,可以在对统计数据有所损失的代价上提供分享功能。具体操作如下:

新浪微博

打开ShareSDK.xml,在新浪微博的应用信息里添加多一个字段“ShareByAppClient”,并设置其值为true。
设置了ShareByAppClient为true以后,ShareSDK会使用新浪微博的客户端来分享,支持传递图文进行分享,支持回流统计,但是不支持分享结果回调,也就是说,微博客户端被打开,即当作分享成功。

微信诸平台

微信和微信朋友圈(不包括微信搜藏)也可以绕开审核机制。方法是打开ShareSDK.xml,在微信或者和微信朋友圈的应用信息里添加多一个字段“BypassApproval”,并设置其值为true。
设置了BypassApproval为true以后,ShareSDK会使用微信的客户端来分享,支持传递图文进行分享,支持回流统计,但是不支持分享结果回调,也就是说,微信客户端被打开,即当作分享成功。

其他平台

ShareSDK在最新版本中已经提供了自定义平台的功能,并在我们的Sample中携带了一个使用自定义平台的方法集成来往分享的例子,这个例子和微博、微信绕开审核制度的方法本质上是一样的。
最后说一下,绕开审核制度来进行分享是在审核未通过之前的权宜之计,ShareSDK不建议开发者长时间使用这种方式进行分享,这一方面对统计数据无益,另一方面一旦目标平台客户端发生变动,可能就无法分享。因此一旦您的应用通过了审核,请尽快切换回常规的分享方式。

 

9、自定义标识

自定义标识的方法

String[] flags = new String[] { “lifei”,”自定义标识”,”测试”};

oks.setCustomFlag(flags);//自定义标识

可以根据设置自定义标识来看到用户分享的平台等数据的分布,我们下面以QQ举例;

图片1

 

如上图所示,是单独分享到QQ的,然后调用自定义标识方法,设置不同的标识来做标记,然后分享成功后可以到后台来查看,如下图所示位置:

图片2

如上图所示位置,配置上自己的ShareSDK的appkey后,分享完之后在这里可以查看到自己设置的自定义标识:

图片3通过自己标记的标识可以看到用户分享的第三方平台和统计某个平台分享或者某个位置分享的比率和次数;

 

 

10、常见问题

分享时需要注意一些常见的问题:绝大部分的微博平台:如新浪微博、腾讯微博、网易微博等都是不支持短时间内重复分享相同文本内容的。因此如果分享的文本重复,会有错误返回。
此外,大部分平台分享时可以@此平台上的其他用户,但不同平台关注时需要提供的字段和权限并不一样。比如新浪微博@其他人时提供的account是其screen_name(即显示出来的名称),腾讯微博提供的是用户名,twitter和facebook都使用uid,但facebook需要在uid前后加中括号(如:uid是“123”,则@他人时提供的是“[123]”)。而且facebook比较麻烦,还需要申请权限,否则@操作无效。